Java设计模式

目录

设计模式原则

设计模式分类

一:创建型模式

1、单例模式(Singleton)

2、工厂模式(Factory)

3、抽象工厂模式(Abstract Factory)

4、生成器模式(Builder)

5、原型模式(prototype)

二:结构型模式

1、代理模式(Proxy)

2、装饰器模式(Decorator/Wapper)

3、适配器模式(Adapter) 

4、桥接模式(Bride)

5、组合模式(Composite)

6、外观/门面模式(Facade)

7、享元模式(Flyweight)

三:行为模式

1、策略模式(Strategy)

2、责任链模式(Chain of Responsibility)

3、命令模式(Command)

4、迭代器模式(Iterator)

5、中介模式(Mediator)

6、备忘录模式(Memento)

7、观察者模式/发布订阅模式(Observer/Listener)

8、状态模式(State)

9、模版模式(template)

10、访问者模式(Visitor)

11、空对象模式(Empty)

12、解释器模式(Interpreter)


设计模式原则

  • 开闭原则:对扩展开放、对修改关闭。
  • 单一职责原则:一个类只做一件事。
  • 依赖倒转原则:类似于ioc,采用接口编程。
  • 迪米特原则:高内聚,低耦合。
  • 接口隔离原则:应该使用多个接口,而不是用单一的总接口。
  • 合成复用原则:尽量使用对象组合,而不是继承来达到复用目的。
  • 里氏替换原则:子类可以扩展父类的功能,但不能改变原有的功能。

设计模式分类

一:创建型模式

  • 提供创建对象的机制, 增加已有代码的灵活性和可复用性

1、单例模式(Singleton)

定义

  • 指一个类只有一个实例,且该类能自行创建这个实例的一种模式。 
  • 单例类只有一个实例对象。
  • 该单例对象必须由单例类自行创建。
  • 单例类对外提供一个访问该单例的全局访问点。

结构

  • 单例类:包含一个实例且能自行创建这个实例的类。
  • 访问类:使用单例的类。

实现

  • 懒汉式
public class LazySingleton {
    // 保证 instance 在所有线程中同步
    private static volatile LazySingleton instance = null;  
    // private 避免类在外部被实例化  
    private LazySingleton() {
    }    
    public static synchronized LazySingleton getInstance() {
        // getInstance 方法前加同步
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}
  • 饿汉式
public class HungrySingleton {
    private static final HungrySingleton instance = new HungrySingleton();
    private HungrySingleton() {
    }
    public static HungrySingleton getInstance() {
        return instance;
    }
}

用例 

  • spring的bean单例模式

2、工厂模式(Factory)

定义:

  • 把对象的创建功能交给工厂,达到解耦目的。

结构:

适用场景:

  • 无法预知对象确切类别及依赖关系时,可使用。
  • 希望复用现有对象来节省系统资源,而不是每次都创建对象。

实现:

用例:

3、抽象工厂模式(Abstract Factory

定义

  • 用于创建一系列相关的对象, 而无需指定其具体类。

结构:

适用场景:

  • 如果代码需要与多个不同系列的相关产品交互,由于无法提前获取相关信息或未来扩展考虑,不希望代码基于产品的具体类来进行构建的情况下使用。
  • 当有一个基于一组抽象方法的类,且其主要功能不明确时,可以使用。

实现:

用例:

  • spring的BeanFactory。
  • 任何用于创建对象但返回接口或抽象类的就是此模式。

搭配模式:

  • 策略模式

4、生成器模式(Builder)

定义

  • 定义一个类来简化复杂对象的创建(分步骤创建)。该类是为了构建另一个类的实例。

结构:

适用场景:

  • 避免“重叠构造函数”的出现。
  • 当希望用代码创建不同形式的产品时使用。
  • 比如订单系统,订单对象就是一个复杂对象,我们可以build来做。

实现:

用例:

  • SpringApplicationBuilder
  • StringBuilder 

5、原型模式(prototype

定义

  • 使你能够复制已有对象, 而又无需使代码依赖它们所属的类

结构

适用场景

  • 创建一个对象的实例非常复杂且耗时时可以使用。
  • 例如我们的DTO、BO、DO、VO转换时可以使用。

实现

用例

  • spring的bean原型模式prototype(scope=prototype)

二:结构型模式

  • 介绍如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效

1、代理模式(Proxy)

定义

  • 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

结构

  • 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
  • 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
  • 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

适用场景:

  • 用于保护原对象。
  • 用于增强原对象。

实现

package proxy;

public class ProxyTest {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.Request();
    }
}
// 抽象主题
interface Subject {
    void Request();
}
// 真实主题
class RealSubject implements Subject {
    public void Request() {
        System.out.println("访问真实主题方法...");
    }
}
// 代理
class Proxy implements Subject {
    private RealSubject realSubject;
    public void Request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.Request();
        postRequest();
    }
    public void preRequest() {
        System.out.println("访问真实主题之前的预处理。");
    }
    public void postRequest() {
        System.out.println("访问真实主题之后的后续处理。");
    }
}

用例:

  • jdk的Proxy类 

2、装饰器模式(Decorator/Wapper

定义

  • 指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。 

结构

  • 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
  •  具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  • 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  • 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

实现

package decorator;

public class DecoratorPattern {
    public static void main(String[] args) {
        Component p = new ConcreteComponent();
        p.operation();
        System.out.println("---------------------------------");
        Component d = new ConcreteDecorator(p);
        d.operation();
    }
}
// 抽象构件角色
interface Component {
    public void operation();
}
// 具体构件角色
class ConcreteComponent implements Component {
    public ConcreteComponent() {
        System.out.println("创建具体构件角色");
    }
    public void operation() {
        System.out.println("调用具体构件角色的方法operation()");
    }
}
// 抽象装饰角色
class Decorator implements Component {
    private Component component;
    public Decorator(Component component) {
        this.component = component;
    }
    public void operation() {
        component.operation();
    }
}
// 具体装饰角色
class ConcreteDecorator extends Decorator {
    public ConcreteDecorator(Component component) {
        super(component);
    }
    public void operation() {
        super.operation();
        addedFunction();
    }
    public void addedFunction() {
        System.out.println("为具体构件角色增加额外的功能addedFunction()");
    }
}

3、适配器模式(Adapter) 

定义:

结构:

适用场景:

实现:

用例:

  • springmvc的HandlerAdapter
  • 例如xml转json,可以新增XmlJsonAdapter适配器类内进行转换

4、桥接模式(Bride)

定义:

结构:

适用场景:

实现:

用例:

5、组合模式(Composite

定义:

结构:

适用场景:

实现:

用例:

​​​​​​​

6、外观/门面模式(Facade)

定义:

结构:

适用场景:

实现:

用例:

7、享元模式(Flyweight)

定义:

结构:

适用场景:

实现:

用例:

搭配模式:

三:行为模式

  • 负责对象间的高效沟通和职责委派

1、策略模式(Strategy

定义

  • 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

结构

  • 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
  • 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
  • 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

实现

public class StrategyPattern {
    public static void main(String[] args) {
        Context c = new Context();
        Strategy s = new ConcreteStrategyA();
        c.setStrategy(s);
        c.strategyMethod();
        System.out.println("-----------------");
        s = new ConcreteStrategyB();
        c.setStrategy(s);
        c.strategyMethod();
    }
}
// 抽象策略类
interface Strategy {
    public void strategyMethod();    //策略方法
}
// 具体策略类A
class ConcreteStrategyA implements Strategy {
    public void strategyMethod() {
        System.out.println("具体策略A的策略方法被访问!");
    }
}
// 具体策略类B
class ConcreteStrategyB implements Strategy {
    public void strategyMethod() {
        System.out.println("具体策略B的策略方法被访问!");
    }
}
// 环境类
class Context {
    private Strategy strategy;
    public Strategy getStrategy() {
        return strategy;
    }
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    public void strategyMethod() {
        strategy.strategyMethod();
    }
}

2、责任链模式(Chain of Responsibility)

3、命令模式(Command)

4、迭代器模式(Iterator)

5、中介模式(Mediator)

6、备忘录模式(Memento)

7、观察者模式/发布订阅模式(Observer/Listener)

8、状态模式(State)

9、模版模式(Template)

10、访问者模式(Visitor)

11、空对象模式(Empty)

12、解释器模式(Interpreter)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值