设计模式原则

设计模式

参考:

[1]: http://c.biancheng.net/view/1322.html ""C语言中文网""
[2]: https://www.bilibili.com/video/BV1Np4y1z7BU

设计原则

开闭原则

对扩展开放、对修改关闭。 可以对代码进行扩展,不可对代码进行修改

​ 需要使用接口和抽象类。

​ 当需要对程序进行扩展时,不需要修改源代码,只需要添加一个新的实现类

image

​ 当我们为SougouInput设置新皮肤时,不需要修改具体的代码只需书写skin3并实现AbstractSkin并setSkin()即可(setSkin由外界调用)。

里氏代换原则

​ 任何父类可以出现的地方,子类一定可以出现。即子类可以扩展父类的功能,但不能修改父类的功能,子类尽可能不重写父类的方法。子类重写父类方法会导致代码的可复用性降低。子类如必须重写父类方法,不应该影响父类方法的含义

​ 当程序违背里氏代换原则时,即子类出现在父类的位置时,程序会发生错误。此时正确的修改方法为:取消它们之间的继承关系,重新设计它们之间的关系。

​ 经典例子:“正方形不是长方形”、”几维鸟不是鸟“。

image

package principle;

public class LSPtest {
    public static void main(String[] args) {
        Bird bird1 = new Swallow();
        Bird bird2 = new BrownKiwi();
        bird1.setSpeed(120);
        bird2.setSpeed(120);
        System.out.println("如果飞行300公里:");
        try {
            System.out.println("燕子将飞行" + bird1.getFlyTime(300) + "小时.");
            System.out.println("几维鸟将飞行" + bird2.getFlyTime(300) + "小时。");
        } catch (Exception err) {
            System.out.println("发生错误了!");
        }
    }
}

//鸟类
class Bird {
    double flySpeed;

    public void setSpeed(double speed) {
        flySpeed = speed;
    }

    public double getFlyTime(double distance) {
        return (distance / flySpeed);
    }
}

//燕子类
class Swallow extends Bird {
}

//几维鸟类
class BrownKiwi extends Bird {
    public void setSpeed(double speed) {
        flySpeed = 0;
    }
}
如果飞行300公里:
燕子将飞行2.5小时.
几维鸟将飞行Infinity小时。

原因在于 几维鸟 虽然也是鸟类,但在当前情况下,几维鸟并不属于鸟类(几维鸟并不会飞),此时如果我们将几维鸟继承于鸟类,则违背里氏代换原则

以下为改进

image

依赖倒置原则

​ 高层模块不应该依赖底层模块,两者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。即要求我们面向抽象编程。类似于开闭原则的具体体现。

​ 依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,所以我们在实际编程中只要遵循以下4点,就能在项目中满足这个规则。

  1. 每个类尽量提供接口或抽象类,或者两者都具备。
  2. 变量的声明类型尽量是接口或者是抽象类。
  3. 任何类都不应该从具体类派生。
  4. 使用继承时尽量遵循里氏替换原则。

接口隔离原则

接口所包含的功能应该小而精,而不应该大而全。

​ 在具体应用接口隔离原则时,应该根据以下几个规则来衡量。

1. 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。
2. 为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。
3. 了解环境,拒绝盲从。每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同深入了解业务逻辑。
4. 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

image

单一职责原则

每个类应该专注于做一件或者一类事

​ 例如:假如一个班级只有班长这一个管理人员,那么这个班长既需要管理学习、管理纪律也需要管理卫生。此时班长具有多重职责,任务多而杂,极易出错。

​ 此时,我们可以设置学习委员承接班长管理学习的职责、设置纪律委员来承接班长管理纪律的职责、设置卫生委员来承接班长管理卫生的职责,而班长只需要负责管理各委员即可。此时各人物具有单一职责

​ 接口隔离原则和单一职责十分相似,两者都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想,但两者是不同的:

  1. 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。

  2. 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。

迪米特原则

又名:最少知识原则。如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

例1】明星与经纪人的关系实例。

分析:明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如与粉丝的见面会,与媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则,其类图如图 1 所示。

image

package principle;

public class LoDtest {
    public static void main(String[] args) {
        Agent agent = new Agent();
        agent.setStar(new Star("林心如"));
        agent.setFans(new Fans("粉丝韩丞"));
        agent.setCompany(new Company("中国传媒有限公司"));
        agent.meeting();
        agent.business();
    }
}

//经纪人
class Agent {
    private Star myStar;
    private Fans myFans;
    private Company myCompany;

    public void setStar(Star myStar) {
        this.myStar = myStar;
    }

    public void setFans(Fans myFans) {
        this.myFans = myFans;
    }

    public void setCompany(Company myCompany) {
        this.myCompany = myCompany;
    }

    public void meeting() {
        System.out.println(myFans.getName() + "与明星" + myStar.getName() + "见面了。");
    }

    public void business() {
        System.out.println(myCompany.getName() + "与明星" + myStar.getName() + "洽淡业务。");
    }
}

//明星
class Star {
    private String name;

    Star(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

//粉丝
class Fans {
    private String name;

    Fans(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

//媒体公司
class Company {
    private String name;

    Company(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
粉丝韩丞与明星林心如见面了。
中国传媒有限公司与明星林心如洽淡业务。

合成复合原则

合成复用原则又叫组合/聚合复用原则。它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

可以降低耦合性

posted @ 2022-01-01 17:46  Voca  阅读(92)  评论(0)    收藏  举报