设计模式篇(四)—— 装饰者模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Michael_HM/article/details/81633843

1.装饰者模式基本介绍

动态地将责任附加到对象上,对扩展功能来说,装饰者比继承更有弹性更灵活(因为子类继承父类扩展功能的前提,是已知要扩展的功能是什么样的,而这是在编译时就要确定的,但是装饰者模式可以实现动态(在运行时)去扩展功能)。

例如:有一家店卖饮品,饮品就有不少种,每一种还可以加项,比如给可乐加冰,加糖,兑水什么的,每次加项的价格还不同,就会将代码弄的很繁琐,这种情况下就可以使用装饰者模式来实现。

应用场景:

1.需要扩展一个类的功能。 2.动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删)

缺点:产生了过多相似的对象,不易排错。

2.装饰者模式

2.1需要实现的资源接口类

public interface Sourceable {
   
   public void method();
}

2.2 被装饰的类

/**
 * 装饰模式,被装饰类
 * @author merlin
 *
 */
public class Source implements Sourceable {
​
   @Override
   public void method() {
      System.out.println("这是原有方法!");
   }
}

2.3 装饰类

/**
 * 装饰器模式的应用场景
 * 1.需要扩展一个类的功能.
 * 2.动态的为一个对象增加功能,而且还能动态撤销.(继承不能做到这一点,继承的功能是静态的,不能动态增删)
 * 缺点:
 *     产生了过多相似的对象,不易排错
 * @author merlin
 *
 */
public class Decorator implements Sourceable{
​
   private Sourceable sourceable;
   
   
   public Decorator(Sourceable sourceable){
      super();
      this.sourceable=sourceable;
   }
   
   @Override
   public void method() {
      System.out.println("修饰之前!");
      sourceable.method();
      System.out.println("修饰之后!");
   }
}

测试类:

public class DecoratorTest {
​
   public static void main(String[] args) {
      Sourceable source = new Source();
      Sourceable obj = new Decorator(source);
      obj.method();
   }
}

测试结果:

修饰之前!
这是原有方法!
修饰之后!

猜你喜欢

转载自blog.csdn.net/Michael_HM/article/details/81633843