含义:
设计模式的本质是面向对象设计原则的实际应用,是对类的封装,继承,多态以及类的关联关系和组合关系的充分理解
优点:
可以提高程序员的思维能力、编程能力和设计能力
使程序设计更加标准化,代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期
使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强
OOP七大原则:
开闭原则:对扩展开放,对修改关闭
里氏替换原则:继承必须确保超类所拥有的性质在子类依然成立
依赖倒置原则:要面向接口编程,不要面向实现编程
单一职责原则:控制类的粒度大小,将对象解耦、提高其内聚性
接口隔离原则:要为各个类建立它们需要的专用接口
迪米特法则:只与你的直接朋友交谈,不跟陌生人说话
合成复用原则:尽量先使用组合和聚合关系来实现,其次才使用继承关系实现
工厂模式:
核心本质:
实例化对象不使用new,用工厂方法代替
将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类耦合
三种模式:
简单工厂模式:用来生产同一等级结构中的任意产品(对于增加的新的产品,需要覆盖已有代码)
工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
抽象工厂模式:围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂
建造者模式:
建造者模式也属于创建者模式,提供了创建对象的最佳方式
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
主要作用:在用户不知道对象的创造过程和细节的情况下就可以直接创建复杂的对象
用户只需要给出指定复杂对象的类型和内容,建造者模式负责按照顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
例如:
工厂(建造者模式):负责制造汽车(组装过程和细节在工厂内)
汽车购买者(用户):只需要说出需要的型号(对象的类型和内容),然后直接购买就可以使用了(不需要知道汽车是怎么组装的)
优点:
产品的建造和表示分离,实现了解耦,使用创建者模式可以使客户端不必知道产品内部组成的细节
将复杂的产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
具体的创建者类之间是相互独立的,有利于系统的扩展,增加新的建造者无需修改原来的代码,符合开闭原则
缺点:
建造者模式所创建的产品一般有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用构建者模式,因此适用范围受到一定的限制
如果产品内部变化复杂,可能会导致需要定义很多具体建造者来实现这种变化,导致系统变得很庞大
应用场景:
需要生产的产品对象具有复杂的内部结构,且茶农对象具有共性
隔离对象的创建和使用,并使得相同的创建过程可以创建不同的产品
适合于一个具有较多零件(属性)的产品(对象)的创建过程
桥接模式:
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立的变化,是一种对象结构型模式,又称为柄体模式和接口模式
好处分析:
桥接模式偶尔类似于多继承方案,但是多继承方案违背了单一职责原则,复用性比较差,类的个数也非常多,桥接模式是比多继承方案更好的解决方法,极大的减少了子类的个数,从而降低管理和维护的成本
桥接模式提高了系统的可扩充性,在两个变化的维度中任意扩展一个维度,都不需要修改原有系统,符合开闭原则,就像一座桥,把两个变化的维度连接起来
劣势分析:
增加系统的理解与设计难度,由于聚合关系在抽象层,要求开发者针对抽象进行设计与编程
桥接模式要求正确识别系统两个独立变化的维度,因此使用范围有一定的局限性
代理模式:
分类:
静态代理和动态代理
静态代理:
角色分析:
抽象对象(一般会使用接口或抽象类解决)
真实角色(被代理的角色)
代理角色(代理真实角色,代理真实角色后,一般会做额外操作)
客户(访问代理对象的人)
好处:
可以使真实角色的操作更加存粹,不用去关注一些公共的业务
公共的交给代理对象,实现了业务的分工
公共业务发生扩展时,方便集中管理
缺点:
一个真实角色就会产生一个代理角色,代码量翻倍,开发效率降低(解决:动态代理)
代码案例:
1.接口
public interface Rent {
public void rent();
}
2.真实角色
public class Host implements Rent {
@Override
public void rent() {
System.out.println("房东要出租房子!!!");
}
}
3.代理角色
public class Proxy implements Rent {
private Host host;
public Proxy(Host host) {
this.host = host;
}
@Override
public void rent() {
seeHouse();
host.rent();
hetong();
fare();
}
public void seeHouse() {
System.out.println("中介带你看房子");
}
public void hetong() {
System.out.println("中介带你签合同");
}
public void fare() {
System.out.println("收取中介费");
}
}
4.客户端访问代理角色
public class Test {
public static void main(String[] args) {
Rent rent = new Proxy(new Host());
rent.rent();
}
}