设计模式04:装饰器模式、享元模式、命令模式、观察者模式
1.Decorator装饰器模式
示例代码:
package Decorator09; /** * 装饰器模式 * 意图:动态的给一个对象添加一些额外的职责。 * 适用性: * 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责 * 处理那些可以撤销的职责 */ public class DecoratorPattern { public static void main(String[] args) { Person zhangsan = new Student("张三"); zhangsan.Operation(); System.out.println("--------------------"); // DecoratorA decoratorA = new DecoratorA(zhangsan); // Person zhangsan = new DecoratorA(zhangsan); zhangsan = new DecoratorA(zhangsan); zhangsan.Operation(); System.out.println("--------------------"); zhangsan = new DecoratorB(zhangsan); zhangsan.Operation(); } } //Component abstract class Person{ protected String name; public abstract void Operation(); } //ConcreteComponent class Student extends Person{ public Student(String name){ this.name=name; } @Override public void Operation() { //职责方法 System.out.println(name+"的职责:学习"); } } //Decorator abstract class Decorator extends Person{ protected Person person; } class DecoratorA extends Decorator{ public DecoratorA(Person person){ this.person = person; } @Override public void Operation() { //职责方法 person.Operation();//原先的职责 System.out.println("新增职责:扫地");//新增职责 } } class DecoratorB extends Decorator{ public DecoratorB(Person person){ this.person = person; } @Override public void Operation() { //职责方法 person.Operation();//原先的职责 System.out.println("新增职责:唱歌");//新增职责 } }
2.Flyweight享元模式
示例代码:
package Flyweight10; /** * 享元模式 * 意图:运用共享技术有效地支持大量细粒度的对象 * */ public class Flyweight { public static void main(String[] args) { PieceFactory pieceFactory = new PieceFactory(); //白棋 Piece whitePiece1 = pieceFactory.getPiece(0); whitePiece1.draw(1,3); } } class PieceFactory{ private Piece[] pieces = {new WhitePiece(),new BlackPiece()}; public Piece getPiece(int key){ if(key==0) return pieces[0]; else return pieces[1]; } } abstract class Piece{ protected String color; public abstract void draw(int x,int y); } class WhitePiece extends Piece{ public WhitePiece(){ this.color="white"; } @Override public void draw(int x, int y) { System.out.println("draw a color: "+color+"piece x: "+x+"y: "+y); } } class BlackPiece extends Piece{ public BlackPiece(){ this.color = "black"; } @Override public void draw(int x, int y) { System.out.println("draw a color: "+color+"piece x: "+x+"y: "+y); } }
package Flyweight10_2; import java.util.HashMap; import java.util.Map; import java.util.Random; public class FlyweightPattern { public static void main(String[] args) { ShapeFactory factory = new ShapeFactory(); Random random = new Random(); String[] colors = {"red","blue","green","white","black"}; for(int i=0;i<10;i++){ System.out.print("第"+i+"个圆: "); int x = random.nextInt(colors.length); Shape shape = factory.getShap(colors[x]); shape.draw(random.nextInt(2022),random.nextInt(100)); } } } //FlyweightFactory class ShapeFactory{ private Map<String ,Shape> map = new HashMap<>(); public Shape getShap(String key){ if(map.containsKey(key)){ return map.get(key); }else { Shape shape = new Circle(key); map.put(key, shape); return shape; } } } //Flyweight abstract class Shape{ protected String color; public abstract void draw(int x,int y); } //ConcreteFlyweight class Circle extends Shape{ public Circle(String color){ System.out.println("create circle color: "+ color); this.color = color; } @Override public void draw(int x, int y) { System.out.println("draw a color: "+color+" circle x: "+x+" y: "+y); } }
3.Command命令模式
示例代码:
package Command11; /** * 命令模式: * 意图:将一个请求封装为对象,从而使得可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。 * 适用于: * 抽象出待执行的动作以参数化某对象 * 在不同时刻指定、排列和执行请求 * 支持取消操作 * 支持修改日志 * 用构建在原语操作上的高层操作构造一个系统 */ public class CommandPattern { public static void main(String[] args) { Tv tv = new Tv();//接收者 Command onCommand = new OnCommand(tv);//命令对象 开机命令 Command offCommand = new OffCommand(tv);//命令对象 关机命令 Invoker invoker = new Invoker();//请求者 invoker.setCommand(onCommand);//请求者设置开机命令 invoker.call();//请求者请求命令 System.out.println("--------------------"); invoker.setCommand(offCommand);//请求者设置关机命令 invoker.call();//请求者请求命令 } } //请求者:执行命令 class Invoker{ private Command command; public void setCommand(Command command){ this.command = command; } public void call(){ //调用 command.Execute(); } } interface Command{ public void Execute(); } class OnCommand implements Command{ private Tv tv; public OnCommand(Tv tv){ this.tv = tv; } @Override public void Execute() { tv.OnAction(); } } class OffCommand implements Command{ private Tv tv; public OffCommand(Tv tv){ this.tv = tv; } @Override public void Execute() { tv.OffAction(); } } //Receiver class Tv { public void OnAction(){ System.out.println("开机..."); } public void OffAction(){ System.out.println("关机..."); } }
4.Observer观察者模式
示例代码:
package Observer12; import java.util.ArrayList; import java.util.List; /** * 观察者模式: * 意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 * 适用于: * 当一个对象的改变需要同时改变其他对象,而且不知道有多少个对象有待改变 */ public class ObserverPattern { public static void main(String[] args) { Subject subjectA = new ConcreteSubject("目标A"); Observer observerB = new ConcreteObserver("张三",subjectA); Observer observerC = new ConcreteObserver("李四",subjectA); Observer observerD = new ConcreteObserver("王五",subjectA); // System.out.println("目标A的状态改变后..."); subjectA.setState("已更新..."); // subjectA.Notify(); subjectA.setState("停更了..."); } } //目标接口 interface Subject{ public void Attach(Observer observer); public void Detach(Observer observer); //状态改变后,通知所有观察者 public void Notify(); public void setState(String state); public String getState(); } class ConcreteSubject implements Subject{ private String name; private String state; private List<Observer> observerList; public ConcreteSubject(String name){ this.name=name; state="未更新"; observerList = new ArrayList<Observer>(); } @Override public void Attach(Observer observer) { observerList.add(observer); } @Override public void Detach(Observer observer) { observerList.remove(observer); } @Override public void Notify() { for (Observer observer: observerList) { observer.update(); } } @Override public void setState(String state) { this.state=state; System.out.println(name+"的状态发生变化,变化后状态为: "+state); Notify(); } @Override public String getState() { return this.state; } } //观察者接口 interface Observer{ public void update(); } class ConcreteObserver implements Observer{ private String state; private String name; //指明目标 private Subject subject; public ConcreteObserver(String name,Subject subject){ this.state=subject.getState(); this.name=name; this.subject = subject; subject.Attach(this); } @Override public void update() { System.out.println(name+"收到通知"); state = subject.getState(); System.out.println(name+"改变后的状态: "+state); } }