Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

设计模式 #114

Open
mwjuan opened this issue Feb 16, 2024 · 0 comments
Open

设计模式 #114

mwjuan opened this issue Feb 16, 2024 · 0 comments

Comments

@mwjuan
Copy link
Owner

mwjuan commented Feb 16, 2024

简单工厂模式

工厂模式是一种创建型模式。通过一个工厂类来封装对象的创建过程,并根据不同的参数返回不同的产品对象实例。核心思想是将对象的创建过程封装在一个工厂类中,而客户端代码只需要通过调用工厂类的静态方法来获取所需的对象实例。

角色

  • Factory:工厂角色
    工厂角色负责实现创建所有实例的内部逻辑
  • Product:抽象产品角色
    抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
  • ConcreteProduct:具体产品角色
    具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例
image

单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
image
多线程访问单例,需要使用lock,确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

装饰者模式

装饰者模式指的是给一个对象添加一些新的功能进行扩展,而且是不改变原来对象的基础上动态的添加。就好比给一个毛坯房刷漆装饰,通过装饰可以让你的房子更加漂亮。
角色

  • 被装饰对象的抽象组件(Component)
    表示定义被装饰者所具备的基本功能,通常使用接口来定义
  • 被装饰对象(ConcreteComponent)
    定义出被装饰对象的具体功能
  • 装饰对象抽象(Decorator)
    定义了所有具体装饰对象的功能规范,需要跟Component被装饰者具备同样的功能,所以需要Decorator实现Component接口。并且装饰者持有被装饰者对象引用
  • 具体的装饰对象(ConcreteDecorator)
    在继承装饰对象的功能外,动态添加新的功能
image

适配器模式

将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
image

代理模式

代理模式指为其他对象提供一种代理,以控制对这个对象的访问。某些情况下,一个对象若不能直接引用另一个对象,而代理对象可以在客户端与目标对象之间起到中介的作用。
image
角色

  • 抽象主题角色(Subject)
    定义了目标对象和代理对象的公用接口,即抽象出了客户端需要调用的接口规范。
public interface Subject {
    void doSomething();
}
  • 真实主题角色(RealSubject)
    定义了真正要处理的对象。
public class RealSubject implements Subject {
    @Override
    public void doSomething() {
        System.out.println("Do something in RealSubject.");
    }
}
  • 代理对象
    代理主题角色(ProxySubject)
    通过持有或者引用了真实主题角色对象来实现抽象主题角色对象所定义的接口方法,并在其中实现额外的操作,比如对目标对象进行管理、监控等。
public class ProxySubject implements Subject {
    private RealSubject realSubject;

    public ProxySubject(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void doSomething() {
        // 对目标对象进行辅助或控制
        System.out.println("Do something before the real subject operation.");
        realSubject.doSomething();
        System.out.println("Do something after the real subject operation.");
    }
}

策略模式

策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化。
角色

  • Strategy: 抽象策略类:策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法(如下图的algorithm())
  • Context: 环境类 /上下文类:上下文是依赖于接口的类(是面向策略设计的类,如下图Context类),即上下文包含用策略(接口)声明的变量(如下图的strategy成员变量)。
    上下文提供一个方法(如下图Context类中的的lookAlgorithm()方法),持有一个策略类的引用,最终给客户端调用。该方法委托策略变量调用具体策略所实现的策略接口中的方法(实现接口的类重写策略(接口)中的方法,来完成具体功能)
  • ConcreteStrategy: 具体策略类:具体策略是实现策略接口的类(如下图的ConcreteStrategyA类和ConcreteStrategyB类)。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体方法。(说白了就是重写策略类的方法)
image

观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
角色

  • Subject(目标)
    目标又称为主题,它是指被观察的对象。在目标中定义了一个观察者集合,它可以存储任意数量的观察者对象,它提供一个接口来增加和删除观察者对象,同时它定义了的通知方法notify()。目标类可以是接口,也可以是抽象类或实现类。
  • ConcreteSubject(具体目标)
    具体目标是目标类的子类,通常它包含经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知。同时它还实现了在目标类中定义的抽象业务逻辑方法(如果有的话)。
  • Observer(观察者)
    观察者将对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法update(),因此又称为抽象观察者。
  • ConcreteObserver(具体观察者)
    在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者Observer中定义的update()方法。通常在实现时,可以调用具体目标类的attach()方法将自己添加到目标类的观察者集合中或通过detach()方法将自己从目标类的观察者集合中删除。
image

JAVA设计模式UML图
JAVA设计模式详解

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant