装饰模式
一、作用:
为已有的功能添加新的功能的设计模式,当系统需要新的功能时候,要在原有的基础上增加一点新的功能的时候,也就是装饰一点功能的时候,不需要再原有的代码上进行修改。
装饰的功能就是把核心职责和核心功能划分开了。
对比生成器模式:
(1)生成器模式类执行是有顺序的
(2)装饰模式执行顺序是没有顺序的,是随机的,想怎么装饰就怎么装饰,装饰的是一些无关紧要的事情,核心的代码还是之前的类在做
二、类图
解释一下:
左边两个实现类(ConsoleLogger FileLogger)是核心的实现类,主要的功能都是由这两个实现的
右边两个实现类(UpLogger,XMLLogger)是装饰类,只是加了一些装饰的属性,核心的功能还是左边的那两个类
三、实现
1、定义方法的接口
public interface ICook { public void cook(); }
2、两个核心实现类
public class Cabbage implements ICook { @Override public void cook() { // TODO Auto-generated method stub System.out.println("cook cabbage"); } } public class Vegetable implements ICook { @Override public void cook() { // TODO Auto-generated method stub System.out.println("cook vegetable"); } }
3、定义Decorator的方式 抽象类
public abstract class Decorator implements ICook { protected ICook cook; public Decorator(ICook cook) { this.cook = cook; } }
4、两个实现装饰功能的 实现类
public class PepperDecorator extends Decorator { public PepperDecorator(ICook cook) { super(cook); } @Override public void cook() { addPepper(); cook.cook(); } public void addPepper() { System.out.println("add some pepper"); } } public class SugarDecorator extends Decorator { public SugarDecorator(ICook cook) { super(cook); } @Override public void cook() { addSugar(); cook.cook(); } public void addSugar() { System.out.println("add some sugar"); } }
5、测试类
public class Client { public static void main(String[] args) { Client client = new Client(); ICook cook = new Cabbage(); ICook pepper = new PepperDecorator(cook); pepper.cook(); } }
时间: 2024-11-10 00:58:57