@[TOC](设计模式思想和设计原则)
1、常用设计原则(记住)
- 开闭原则
对扩展开放修改关闭,为了使程序的扩展性好,易于维护和升级。 - 里氏代换原则
任何基类可以出现的地方,子类一定可以出现,多使用多态的方式。 - 依赖倒装原则
尽量使用多依赖抽象类或接口,而不是具体的实现类,对子类具有强制性和规范性。 - 接口隔离原则
尽量多使用小接口而不是大接口,避免接口的污染,降低类之间的耦合度。 - 迪米特法则
一个实体类应当尽量少于其他实体类之间发生相互作用,使系统功能模块相对独立。高内聚,低耦合。 - 合成复用原则
尽量多使用合成/聚合的方式,而不是继承的方式。
2、设计模式模式(重点)
2.1、单例模式
- 单例模式主要分为懒汉式和饿汉式,懒汉式涉及到空间浪费的问题,饿汉式涉及到多个线程同时访问的问题。
2.2、普通工厂模式
(1)基本概念
- 普通工厂方法模式就是建立一个工厂类,对实现了同一个接口的不同实现类进行实例的创建。
(2)类图结构
(3)主要缺点
- 在普通工厂的方法模式中,如果传递的字符串错误,则不能正确的创建对象,并且可能出现空指针的异常。
2.3、多个工厂方法模式
(1)类图结构
(2)主要缺点
- 在多个工厂方法模式中,为了能够正常的创建对象,先需要创建工厂类才能够调用工厂类里边的方法。
2.4、静态工厂方法模式
(1)类图结构
(2)实际意义
- 工厂方法模式适合:凡是出现了大量的产品需要创建且具有共同的接口时,可以通过工厂方法模式创建。
(3)主要缺点
- 工厂模式有一个问题就是,类的创建必须依赖与工厂类,也就是说如果想要程序生产新的产品,就必须要对工厂类进行扩展,这就违背了开闭原则。
2.5、抽象工厂模式
(1)类图结构
2.6、装饰器模式
(1)基本概念
- 装饰器模式就是给一个对象动态的增加一些新的功能,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例
(2)类图结构
(3)实际意义
- 可以实现一个类功能的扩展。
- 可以动态的增加功能,而且还能动态的撤销(继承不行)。
- 缺点:产生过多相似的对象,不易排错
(4)代码验证
// 定义一个接口
public interface Sourceable {
// 自定义抽象方法
void method();
}
// 被装饰类
public class Source implements Sourceable{
@Override
public void method() {
System.out.println("素颜美可以如此之美!");
}
}
/**
* 装饰类
*/
public class Decorator implements Sourceable{
private Sourceable source;
public Decorator(Sourceable source) {
this.source = source;
}
@Override
public void method() {
source.method(); //保证原有功能不变
System.out.println("化妆之后你会更美!");
}
}
/**
* 测试类
*/
public class SourceableTest {
public static void main(String[] args) {
Sourceable source = new Source();
source.method();
System.out.println("--------------");
// 使用装饰器进行修饰
Sourceable sourceable = new Decorator(source);
sourceable.method();
}
}
2.7、代理模式
(1)基本概念
- 代理模式就是找一个代理类替换原对象进行一些操作。
- 比如我们在租房子的时候找中介,中介就是我们的代理。
(2)类图结构
(3)实际意义
- 如果在使用的时候需要对原有的方法进行改进,可以采用一个代理类调用原有的方法,并且对产生的结果进行控制。
- 使用代理模式,可以将功能划分的更加清晰,有助于后期维护。
(4)使用代理模式和装饰器模式的比较
- 装饰器模式通常的做法是将原始对象作为一个参数传递给装饰者的构造器,而代理模式通常在一个代理类里创建一个被代理的对象
- 装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对象的访问
(5)代码验证
public class Proxy implements Sourceable{
// 被代理的对象
private Source source;
public Proxy(){
source = new Source();
}
@Override
public void method() {
source.method();
System.out.println("我和装饰器模式是不一样的!");
}
}
/**
* 测试类
*/
public class SourceableTest {
public static void main(String[] args) {
Sourceable source = new Source();
source.method();
System.out.println("--------------");
// 使用装饰器进行修饰
Sourceable sourceable = new Decorator(source);
sourceable.method();
System.out.println("--------------");
Sourceable sourceable1 = new Proxy();
sourceable1.method();
}
}
2.8、模板方法模式
(1)基本概念
- 模板方法模式主要指一个抽象类中封装了一个固定的流程,流程中的具体步骤可以由不同的子类分别实现,通过抽象类产生不同的结果。
(2)类图结构
(3)实际意义
- 将多个子类共有的逻辑且相同的内容提取出现,用抽象方法的形式实现复用的目的
- 不同的子类实现不同效果的多态,有助于后期的维护