设计模式----装饰器模式

概述

装饰模式以对调用端透明的方式动态扩展对象的功能,是继承关系的一个替代方案。调用端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展

涉及角色

UML

这里写图片描述

使用场景

  • 扩展一个类的功能
  • 动态增加功能,动态撤销

优点

装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能

缺点

多层装饰比较复杂,产生过多相似的对象,不易排错!

代码示例

以服务生为例,新入行的服务生和老练的服务生,新入行的服务生会按照培训流程等进行接待客人,但老练的服务生会察言观色,可能会根据不同的人加入不同的沟通技巧。

package com.designpattern.decorator;

public interface Service {

    public void service();

}
package com.designpattern.decorator;

public class NewWaiter implements Service {

    @Override
    public void service() {
        // TODO Auto-generated method stub
        System.err.println("请问您要点些什么");
    }

}
package com.designpattern.decorator;

public class SkilledWaiter implements Service{

    private Service service; 

    public SkilledWaiter(Service service) {
        // TODO Auto-generated constructor stub
        this.service= service;
    }
    @Override
    public void service() {
        // TODO Auto-generated method stub
        System.err.println("欢迎光临本店");
        service.service();
        System.err.println("有需要您随时叫我");
    }

}
package com.designpattern.decorator;

public class TestMain {
    public static void main(String[] args) {
        Service waiter = new NewWaiter();
        Service waitress = new SkilledWaiter(waiter);
        waitress.service();
    }
}

运行结果:

欢迎光临本店
请问您要点些什么
有需要您随时叫我

猜你喜欢

转载自blog.csdn.net/yue530tomtom/article/details/79792811