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, 当不能用生成子类的方法进行当前系统的扩充时;
来源: https://www.cnblogs.com/yanghj/p/13411310.html