不懂七大设计原则等于白学软件开发篇

前置介绍

软件开发,不管是前端还是后端,不管你用的是springboot还是django,uniapp还是mpvue,哪怕是数据库连接平台redis、mabits、hibernate,都或多或少用了设计原则。
fafs
你说你不会,不合理呀。

接下来给大家介绍一下我练习后的感悟。 提示:代码注释比较有用哦。

单一职责原则

代码奉上:

package singleresponsbility;

/**
 * @author yzq
 * @projectName designdemo
 * @packageName singleresponsbility :一个类只能有一种职责 =》一个方法只能有一个职责。
 * @data 2020-09-06 09:
 */
public class SingleResponsibility1 {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        vehicle.run("飞机");
        vehicle.run("汽车");
    }
}
/*违反了单一职责原则。    
* 解决:
* 根据不同交通方法,分解成不同类
* */
class Vehicle{
    public void run(String args) {
        System.out.println(args+"在公路上运行");
    }
}

改良一

package singleresponsbility;

/**
 * @author yzq
 * @projectName designdemo
 * @packageName singleresponsbility
 * @data 2020-09-06 09:
 */
public class SingleResponsibility2 {
    public static void main(String[] args) {
        Vehicle2 vehicle = new Vehicle2();
        vehicle.run("汽车");
        Aircle2 aircle2 = new Aircle2();
        aircle2.run("飞机");

    }
}

/*遵守单一职责原则,但是需要改动测试和执行类。
* 解决:
* 直接改动Vehicle类
* */
class Vehicle2{
    public void run(String args) {
        System.out.println(args+"在公路上运行");
    }
}

class Aircle2{
    public void run(String args) {
        System.out.println(args+"在公路上运行");
    }
}

改良二

package singleresponsbility;

/**
 * @author yzq
 * @projectName designdemo
 * @packageName singleresponsbility
 * @data 2020-09-06 09:
 */
public class SingleResponsibility3 {
    public static void main(String[] args) {
        Vehicle3 vehicle = new Vehicle3();
        vehicle.airRun("飞机");
        vehicle.run("汽车");
    }
}

/*在类上没有遵守单一职责原则,但是在方法上遵守单一职责原则
* 优点:
* 改变代码不大,对增加开发,对修改关闭
* */
class Vehicle3{
    public void run(String args) {
        System.out.println(args+"在公路上运行");
    }
    public void airRun(String args) {
        System.out.println(args+"在天空运行");
    }
    public void waterRun(String args) {
        System.out.println(args+"在水中运行");
    }
}

开闭原则

package opencloseeprinciple;

/**
 * @author yzq
 * @projectName designdemo
 * @packageName opencloseeprinciple
 * @described 对拓展开放,对修改关闭 =>将共有方法抽象出接口。
 * @data 2020-09-06 14:07
 */
public class OpenClosed1 {
    public static void main(String[] args) {
        Shape1 circle = new Circle();
        Shape1 rectangle = new Rectangle();
        new GraphicCreate().drawShape(circle);
        new GraphicCreate().drawShape(rectangle);
        //添加新的shape对象不改变其他实现类
    }
}

class GraphicCreate{
    public void drawShape(Shape1 s){
        s.drawShape();
    }
}

interface Shape1{
    public void drawShape();
}

class Circle implements Shape1{
    public void drawShape(){
        System.out.println("画圆");
    }
}

class Rectangle implements Shape1{
    public void drawShape(){
        System.out.println("画矩");
    }
}

里氏置换原则

package liskovsubstitution;

/**
 * @author yzq
 * @projectName designdemo
 * @packageName liskovsubstitution:
 * @describe(子类不要随意修改父类;继承造成程序有侵入性,可移植性降低,尤其不能修改父类。)
 * @describe  =》所有引用父子类的都使用相同的基类对象,适当用聚合、组合、依赖解决问题;子类不要重写父类方法。
 * @data 2020-09-06 13:
 */
public class Substitution {
    public static void main(String[] args) {
        Sus sus = new Sus();
        System.out.println(sus.add(2,3));
    }
}

//采用聚合等方式避免重写
class Add {
    public int add(int a,int b)
    {
        return a+b;
    }
}
class Sus{

    private Add a = new Add();
    //不继承不会重写A
    public int add(int a,int b){
        //使用组合完成功能实现
        return this.a.add(a,b);
    }
}

接口隔离原则

package interfacesegregation;

/**
 * @author yzq
 * @projectName designdemo
 * @packageName interfacesegregation 一个雷对另一个类的依赖建立在最小的程度上
 * @data 2020-09-06 10:
 */
public class segregation {
    public static void main(String[] args) {
        A a = new A();
        a.operation1();
        a.operation4();

        C c = new C();
        c.operation2();
        c.operation3();
    }
}

//接口1
interface Interface1{
    void operation1();
}


//接口2
interface Interface2{
    void operation2();
    void operation3();
}


//接口3
interface Interface3{
    void operation4();
    void operation5();
}

class B implements Interface1,Interface3{

    @Override
    public void operation1() {
        System.out.println("B实现1");
    }

    @Override
    public void operation4() {
        System.out.println("B实现4");
    }

    @Override
    public void operation5() {
        System.out.println("B实现50");
    }
}

class C implements Interface2,Interface1{

    @Override
    public void operation1() {
        System.out.println("C 实现 1");
    }

    @Override
    public void operation2() {
        System.out.println("C 实现 2");
    }

    @Override
    public void operation3() {
        System.out.println("C 实现 3");
    }
}

class A extends B{//如果AB功能是相同的使用这种方式比较少代码

}

依赖倒置原则

package dependenceinversion;

/**
 * @author yzq
 * @projectName designdemo
 * @packageName dependenceinversion: 细节依赖抽象;具体类实现抽象;高层与底层模块依赖抽象;中心思想=》依赖接口编程。
 * @data 2020-09-06 11:
 */
public class Inversion1 {
    public static void main(String[] args) {
        /*该方式只能接受邮箱信息,不能接受其他类比如微信、qq信息
        * 优化:
        * 对接受信息抽象储接口
        * */
        Persion1 persion = new Persion1();
        Email1 email1 = new Email1();
        persion.receive(email1);
    }
}


class Email1{
    public String getInfo(){
        return "电子邮件信息";
    }
}

class Persion1{
    public void receive(Email1 email1){
        System.out.println("接收到:"+email1.getInfo());
    }
}

改良一

package dependenceinversion;

/**
 * @author yzq
 * @projectName designdemo
 * @packageName dependenceinversion: 细节依赖抽象;具体类实现抽象;高层与底层模块依赖抽象;中心思想=》依赖接口编程。
 * @data 2020-09-06 11:
 */
public class Inversion2 {
    public static void main(String[] args) {
        /*该方式能接受邮箱信息及其他类比如微信、qq信息
        * 优点:
        * 对信息进行抽象实现任意组装
        * */
        //接口方式
        Persion2 persion = new Persion2();
        EInfo email1 = new Email2();
        EInfo wchat = new Wechat();
        persion.receive(email1);
        persion.receive(wchat);

        //构造方法方式
        EInfo3 info3 = new Email3();
        Persion3 persion3 = new Persion3(info3);
        persion3.receive();

        //set方式
        EInfo4 info4 = new Wechat4();
        Persion4 persion4 = new Persion4();
        persion4.setInfo(info4);
        persion4.receive();
    }
}


//抽象接口方式
class Email2 implements EInfo{
    public String getInfo(){
        return "电子邮件信息";
    }
}

class Wechat implements EInfo{
    public String getInfo(){
        return "微信信息";
    }
}

interface EInfo{
    String getInfo();
}
class Persion2{
    public void receive(EInfo info){
        System.out.println("接收到:"+info.getInfo());
    }
}




//构造方法方式
class Email3 implements EInfo3{
    public String getInfo(){
        return "电子邮件信息";
    }
}

class Wechat3 implements EInfo3{
    public String getInfo(){
        return "微信信息";
    }
}
interface EInfo3{
    String getInfo();
}

class Persion3{
    private EInfo3 info;

    public Persion3(EInfo3 info){
        this.info =info;
    }
    public void receive(){
        System.out.println("接受到:"+this.info.getInfo());
    }
}



//set方式
class Email4 implements EInfo4{
    public String getInfo(){
        return "电子邮件信息";
    }
}

class Wechat4 implements EInfo4{
    public String getInfo(){
        return "微信信息";
    }
}
interface EInfo4{
    String getInfo();
}

class Persion4{
    private EInfo4 info;

    public void setInfo(EInfo4 info) {
        this.info = info;
    }

    public void receive(){
        System.out.println("接受到:"+this.info.getInfo());
    }
}

迪米特法则

package demeterprinciple;

import java.util.ArrayList;
import java.util.List;

/**
 * @author yzq
 * @projectName designdemo
 * @packageName demeterprinciple
 * @describe 对象之间应保持最少了解,即减少耦合=》只与有耦合的对象通信,陌生的类不要以局部变量出现(成员变量,方法参数,方法返回值),耦合方式:依赖(弱关联,局域变量,方法形参)、关联(成员变量)、组合(has a)、聚合(强关联)、
 * @data 2020-09-06 14:
 */
public class demeter1 {
    public static void main(String[] args) {

        Depatrment allDep = new AllDep();
        Depatrment schDep = new SchDep();
        School school = new School();
        school.setDepatrment(allDep);
        school.setDepatrment(schDep);
        school.findDep();
    }
}

class School{
    private List<Depatrment> depatrment = new ArrayList<Depatrment>();

    public void setDepatrment(Depatrment depatrment) {
        this.depatrment.add(depatrment);
    }

    public void findDep(){
        for (Depatrment de :this.depatrment){
            de.getID();
        }
    }
}

interface Depatrment{
    public  void  getID();
}

class AllDep implements Depatrment{

    @Override
    public void getID() {
        System.out.println("总部ID");
    }
}

class SchDep implements Depatrment{


    @Override
    public void getID() {
        System.out.println("学院ID");
    }
}

合成复用原则

package compositereuse;

/**
 * @author yzq
 * @projectName designdemo
 * @packageName compositereuse
 * @describe 尽量使用合成/聚成,不使用继承
 * @data 2020-09-06 16:05
 */
public class Reuse1 {
}

总结

设计模式怎么搞更好:

  • 类独立出变化项,作为依赖,不要继承;
  • 面向接口;
  • 低耦合
全部评论

相关推荐

蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务