韦小宝有7个老婆,但是每个都只有他这一个老公,他的所有老婆叫老公时,指的都是他,他就是一个单例。
为了确保一个类有且仅有一个实例,并为它提供一个全局访问点。
public class Singleton {//保证 instance 在所有线程中同步private static volatile Singleton instance = null;private Singleton() {} //private 避免类在外部被实例化public static synchronized Singleton getInstance() {//getInstance 方法前加同步if (instance == null) {instance = new Singleton();}return instance;}
}
适合需要做全局统一控制的场景,例如:全局唯一的编码生成器。
小明追妹子的时候,请她喝了不少咖啡,她爱喝卡布奇诺,每次去咖啡店,只要跟服务员说“来杯卡布奇诺”就行了,虽然各家的口味有些不同,但是不管是星爸爸还是Costa,都能够提供卡布奇诺这种咖啡。这里的星爸爸和Costa就是生产咖啡的工厂。
直接从工厂类中获取各种产品,不在需要亲自去挑选产品。
用户
public class FactoryPattern {public static void main(String[] args) {
// 1、创建工程类Factory factory = new ConcreteFactoryA();
// 2、生产产品Product product = ateProduct();
// 3、消费产品product.use();}
}
产品力
//实体类产品
interface Product {public void use();
}//具体产品A:实现抽象产品中的抽象方法
class ConcreteProductA implements Product {public void use() {System.out.println("具体产品A显示...");}
}
工厂类
//抽象工厂:提供了厂品的生成方法
interface Factory {public Product createProduct();
}//具体工厂A:实现了厂品的生成方法
class ConcreteFactoryA implements Factory {@Overridepublic Product createProduct() {System.out.println("具体工厂A生成-->具体产品A.");return new ConcreteProductA();}
}
大学毕业,想要送给室友一个有纪念意义的礼物,就找到一张大家的合照,在上面写上“永远的兄弟!”,然后拿去礼品店装了个相框,再包上礼盒。这里的我和礼品店都是装饰器,都没有改变照片本身,却都让照片变得更适合作为礼物送人。
在不改变原有功能的基础下,对功能进行扩展。
用户
public class DecoratorPattern {public static void main(String[] args) {Component component = new ConcreteComponent();component.operation();System.out.println("---------------------------------");ConcreteDecorator decorator = new ConcreteDecorator(component);decorator.operation();}
}
构建角色
//抽象构件角色
interface Component {public void operation();
}//具体构件角色
class ConcreteComponent implements Component {public ConcreteComponent() {System.out.println("创建具体构件角色");}public void operation() {System.out.println("调用具体构件角色的方法operation()");}
}
装饰角色
class ConcreteDecorator {private Component component;public ConcreteDecorator(Component component) {thisponent = component;}public void operation() {component.operation();System.out.println("为具体构件角色增加额外的功能addBehavior()");}
}
适合需要(通过配置,如:diamond)来动态增减对象功能的场景。
适合一个对象需要N种功能排列组合的场景(如果用继承,会使子类数量爆炸式增长)
淘宝店客服总是会收到非常多的重复问题,例如:有没有现货?什么时候发货?发什么快递?大量回答重复性的问题太烦了,于是就出现了小蜜机器人,他来帮客服回答那些已知的问题,当碰到小蜜无法解答的问题时,才会转到人工客服。这里的小蜜机器人就是客服的代理。
代理用户的请求,去完整后续的各项任务。
用户
public class ProxyPattern {public static void main(String[] args) {
// 获取代理对象Proxy proxy = new Proxy();
// 执行方法quest();}
}
真实主题
//真实主题
class RealSubject {// 2、真实方法public void request() {System.out.println("访问真实主题方法...");}
}
代理类
//代理
class Proxy {private RealSubject realSubject;public void request() {realSubject = new RealSubject();
// 1、之前方法preRequest();
// 2、真实方法quest();
// 3、之后方法afterRequest();}// 1、之前方法public void preRequest() {System.out.println("访问真实主题之前的预处理。");}// 3、之后方法public void afterRequest() {System.out.println("访问真实主题之后的后续处理。");}
}
出差在外,想了解孩子在家的情况,这时候只要加入“相亲相爱一家人”群,老爸老妈会经常把孩子的照片和视频发到群里,你要做的就是作为一个观察者,刷一刷群里的信息就能够了解一切了。
适用于一对多的的业务场景,一个对象发生变更,会触发N个对象做相应处理的场景。
用户
public class ObserverPattern {public static void main(String[] args) {
// 1、创建目标对象ConcreteSubject subject = new ConcreteSubject();
// 2、创建具体观察者A、BObserver obsA = new ConcreteObserverA();Observer obsb = new ConcreteObserverB();
// 3、将具体观察者加入到目标对象中subject.add(obsA);subject.add(obsb);
// 4、调用A、B查看ifoy();}
}
具体目标
//具体目标
class ConcreteSubject {protected List<Observer> observers = new ArrayList<Observer>();//增加观察者方法public void add(Observer observer) {observers.add(observer);}
// 调用观察者执行public void notifoy() {System.out.println("具体目标状态发生改变...");System.out.println("--------------");for (Observer obs : observers) {obs.process();}}
}
观察者A、B
//抽象观察者
interface Observer {void process(); //具体的处理
}//具体观察者A
class ConcreteObserverA implements Observer {public void process() {System.out.println("具体观察者A处理!");}
}//具体观察者B
class ConcreteObserverB implements Observer {public void process() {System.out.println("具体观察者B处理!");}
}
男生追妹子时,一般都会用到这种模式,常见的策略有这些:约会吃饭;看电影;看演唱会;逛街;去旅行……,虽然做的事情不同,但可以相互替换,唯一的目标都是捕获妹子的芳心。
为同一的内容,选择不同的解决方案。
用户
public class StrategyPattern {public static void main(String[] args) {
// 1、创建环境类对象Context context = new Context();
// 2.1、创建策略类A对象Strategy strategyA = new ConcreteStrategyA();
// 3.1、将策略A添加到环境类中context.setStrategy(strategyA);
// 4.1、执行策略A方法context.algorithm();System.out.println("-----------------");
// 2.1、创建策略类B对象Strategy strategyB = new ConcreteStrategyB();
// 3.1、将策略B添加到环境类中context.setStrategy(strategyB);
// 4.1、执行策略B方法context.algorithm();}
}
策略类
//抽象策略类
interface Strategy {public void algorithm(); //策略方法
}//具体策略类A
class ConcreteStrategyA implements Strategy {public void algorithm() {System.out.println("具体策略A的策略方法被访问!");}
}//具体策略类B
class ConcreteStrategyB implements Strategy {public void algorithm() {System.out.println("具体策略B的策略方法被访问!");}
}
待解决问题
//环境类
class Context {private Strategy strategy;public void setStrategy(Strategy strategy) {this.strategy = strategy;}public void algorithm() {strategy.algorithm();}
}
下载地址
CSDN地址
百度网盘
链接:
提取码:f0zv
本文发布于:2024-02-01 02:52:14,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170672713433351.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |