设计模式原则
设计模式
参考:
[1]: http://c.biancheng.net/view/1322.html ""C语言中文网""
[2]: https://www.bilibili.com/video/BV1Np4y1z7BU
设计原则
开闭原则
对扩展开放、对修改关闭。 可以对代码进行扩展,不可对代码进行修改
需要使用接口和抽象类。
当需要对程序进行扩展时,不需要修改源代码,只需要添加一个新的实现类

当我们为SougouInput设置新皮肤时,不需要修改具体的代码只需书写skin3并实现AbstractSkin并setSkin()即可(setSkin由外界调用)。
里氏代换原则
任何父类可以出现的地方,子类一定可以出现。即子类可以扩展父类的功能,但不能修改父类的功能,子类尽可能不重写父类的方法。子类重写父类方法会导致代码的可复用性降低。子类如必须重写父类方法,不应该影响父类方法的含义
当程序违背里氏代换原则时,即子类出现在父类的位置时,程序会发生错误。此时正确的修改方法为:取消它们之间的继承关系,重新设计它们之间的关系。
经典例子:“正方形不是长方形”、”几维鸟不是鸟“。

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小时。
原因在于 几维鸟 虽然也是鸟类,但在当前情况下,几维鸟并不属于鸟类(几维鸟并不会飞),此时如果我们将几维鸟继承于鸟类,则违背里氏代换原则
以下为改进

依赖倒置原则
高层模块不应该依赖底层模块,两者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。即要求我们面向抽象编程。类似于开闭原则的具体体现。
依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,所以我们在实际编程中只要遵循以下4点,就能在项目中满足这个规则。
- 每个类尽量提供接口或抽象类,或者两者都具备。
- 变量的声明类型尽量是接口或者是抽象类。
- 任何类都不应该从具体类派生。
- 使用继承时尽量遵循里氏替换原则。
接口隔离原则
接口所包含的功能应该小而精,而不应该大而全。
在具体应用接口隔离原则时,应该根据以下几个规则来衡量。
1. 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。
2. 为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。
3. 了解环境,拒绝盲从。每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同深入了解业务逻辑。
4. 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

单一职责原则
每个类应该专注于做一件或者一类事
例如:假如一个班级只有班长这一个管理人员,那么这个班长既需要管理学习、管理纪律也需要管理卫生。此时班长具有多重职责,任务多而杂,极易出错。
此时,我们可以设置学习委员承接班长管理学习的职责、设置纪律委员来承接班长管理纪律的职责、设置卫生委员来承接班长管理卫生的职责,而班长只需要负责管理各委员即可。此时各人物具有单一职责
接口隔离原则和单一职责十分相似,两者都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想,但两者是不同的:
-
单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。
-
单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。
迪米特原则
又名:最少知识原则。如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
例1】明星与经纪人的关系实例。
分析:明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如与粉丝的见面会,与媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则,其类图如图 1 所示。

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;
}
}
粉丝韩丞与明星林心如见面了。 中国传媒有限公司与明星林心如洽淡业务。
合成复合原则
合成复用原则又叫组合/聚合复用原则。它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
可以降低耦合性

浙公网安备 33010602011771号