0-前言
装饰模式定义:动态给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
1-实现
1-1、易看的UML图:
1-2、代码实现:
//1、演员类(component,直接实现,未抽取父类,可抽取父类) class Actor { public void Act() { System.out.println("演员开始表演了"); } } //2、Decorator(装饰抽象类) class Stylist extends Actor { protected Actor actor; public void MakeActor(Actor _actor) { this.actor = _actor; } @Override public void Act() { if (actor !=null) { actor.Act(); } } } //2-1、ConcreteComponentA(具体装饰者A--古装造型师) class AncientStylist extends Stylist { private String State; @Override public void Act() { System.out.println("古装造型师给演员化妆了"); State = "演员状态挺好的"; System.out.println(State); super.Act(); } } //2-2、ConcreteComponentB(具体装饰者B) class ModernStylist extends Stylist { public void AddBehaver() { System.out.println("给演员打了个气"); } @Override public void Act() { System.out.println("现代造型师给演员化妆了"); AddBehaver(); super.Act(); }
客户端:
Actor actor = new Actor(); AncientStylist ancientStylist =new AncientStylist(); ModernStylist modernStylist = new ModernStylist(); ancientStylist.MakeActor(actor); ancientStylist.Act(); modernStylist.MakeActor(actor); modernStylist.Act();
运行结果:
2、应用场景简单总结
1、当需要以不影响其他对象为前提实现动态、透明地给单个对象添加职责时;
2、当需要将对象的某些职责进行撤销操作时;
3、当不能用生成子类的方法进行当前系统的扩充时;