版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}
}
测试结果:
修饰之前!
这是原有方法!
修饰之后!