设计模式就是对软件设计过程中存在的普遍问题,所提出的解决方案。能够很好的解决一些常见的问题。
设计模式的最终目的就是:高内聚低耦合
顾名思义,我们设计的类尽量负责一项功能,这样不容易造成代码混乱,避免出现一些bug。
Single类:
public class single{
public static void main(String[] args){
People people = new People;
people.run("老师");
people.run("学生");
people.run("校长");
}
}
People类:
public class People{
void run(String type){
System.out.println(type+"给学生上课");
}
}
这样会造成,不管是老师、学生、校长都会调用这个方法,因为People不止负责了一个功能,所以该设计有问题。
对于上面的例子,我们采用单一职责原则重写一下,将People拆分成三个类,分别是学生、老师、校长。让他们负责各自的功能,使其互相不影响。如果想对学生做限制,那么只需要对学生类进行修改。
或者可以将上面People分为三个方法,每个方法对应不同的人员,将单一职责落在方法层面而不是类层面
优点:
缺点:
类不应该依赖不需要的接口,接口尽量小颗粒划分、如果将多个方法合并为一个接口,再提供给其他系统使用的时候,就必须实现该接口的所有方法,那些方法是根本不需要的,造成使用者的混淆
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QaVgzavi-1593420283358)(https://raw.githubusercontent.com/iszhonghu/Picture-bed/master/img/20200629150212.png)]
Potato类
public class Potato{
public void run(){
System.out.println("买了土豆");
}
}
People类
public class People{
public void bug(Potato potato){
potato.run();
}
}
Test类
public class Test{
public staticvoid main(String[] args){
People people = People();
people.bug(new Potato());
}
}
上述在反例中,如果不想买土豆,想买其他的蔬菜,就比较麻烦还需要改People方法,这就是代码中的模块和模块之间的耦合性太高。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QuXNMN0h-1593420283360)(https://raw.githubusercontent.com/iszhonghu/Picture-bed/master/img/20200629150342.png)]
这样我们从底层的类抽象出一个接口类,其直接和高层进行交互,而底层的一些类则不参与,这样能降低耦合度,提高稳定性。
public interface Vegetables{
public void run();
}
Potato类
public class Potato implements Vegetables{
public void run(){
System.out.println("买了土豆");
}
}
Tomato类
public class Tomato implements Vegetables{
public void run(){
System.out.println("买了番茄");
}
}
public class People{
public void bug(Vegetables vegetable){
vegetable.run();
}
}
public class Test{
public static void main(String[] args){
People people = new People();
people.bug(new Potato());
people.bug(new Tomato());
}
}
该原则的重点在于”倒转“,要从底层往上思考,尽量抽象抽象类和接口。此例子很好的解释了”上层模型不能依赖底层模块,应该都依赖于抽象“。
主要是阐述了对继承extend的一些看法
继承的优点:
继承的缺点:
里氏替换原则是继承的基础,只有当子类替换父类时,软件功能仍不受影响,才说明父类真正被复用了。
子类必须实现父类的抽象方法,但不得重写(覆盖)父类的非抽象的方法
子类中可以增加自己特有的方法。
当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更加宽松。
前面四个原则都是为了开闭原则做铺垫,其是最基础、最重要的设计原则,核心为对扩展开发,对修改关闭、简单来说,通过扩展软件的行为来实现变化,而不是通过修改来实现。
直接(熟悉)的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系, 我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。
其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量 的形式出现在类的内部。