初探设计模式:装饰器模式

模式介绍

代理模式的中介性质有所不同的是,装饰器模式是为了扩展对象的功能,可以针对对象做更为细化的操作

装饰器模式大致分为四种核心角色:

1. Component接口

Component接口相当于接口根本的方法,比如现在有一个员工接口,员工基本职能为工作:

public interface Staff {

    /**
     * 工作
     */
    void work();
}
2. ConcreteComponent实现类

ConcreteComponent类是员工接口的实现类。员工一、员工二:

public class StaffOne implements Staff {

    /**
     * 工作
     */
    @Override
    public void work() {
        System.out.println("一号程序员开始工作");
    }
}
public class StaffTwo implements Staff {

    /**
     * 工作
     */
    @Override
    public void work() {
        System.out.println("二号程序员开始工作");
    }
}
3. Decorator抽象类

Decorator类实现了Component接口,可以让每一个装饰器本身也可以被更外层的装饰器所包装,包装的方式就是把Component接口对象作为参数,传入到外层装饰器的构造函数当中。

public class StaffDecorator implements Staff {

    protected Staff StaffDecorator;

    public StaffDecorator(Staff staff) {
        this.StaffDecorator = staff;
    }

    /**
     * 工作
     */
    @Override
    public void work() {
        StaffDecorator.work();
    }
}
4. ConcreteDecorator包装类

所有的包装类,都继承自Decorator抽象类,这么做是为了实现多层嵌套包装。扩充被包装类的功能

开始工作,打开电脑:

public class TurnOnComputerDecorator extends StaffDecorator{

    public TurnOnComputerDecorator(Staff staff) {
        super(staff);
    }


    /**
     * 工作
     */
    @Override
    public void work() {
        StaffDecorator.work();
        turnOnComputer();
    }

    /**
     * 打开工作电脑
     */
    private void turnOnComputer() {
        System.out.println("打开了工作电脑");
    }
}

开始工作,打开电脑,接了杯咖啡:

public class CoffeeDecorator extends StaffDecorator {

    public CoffeeDecorator(Staff staff) {
        super(staff);
    }

    /**
     * 工作
     */
    @Override
    public void work() {
        super.work();
        coffee();
    }

    private void coffee() {
        System.out.println("接了杯咖啡");
    }
}

包装类使用

public class DecoratorClient {
    public static void main(String[] args) {

        // 员工一开始工作,打开了工作电脑
        StaffDecorator staffOne  = new TurnOnComputerDecorator(new StaffOne());
        // 员工二开始工作,打开了工作电脑,接了杯咖啡(装饰器嵌套使用)
        StaffDecorator staffTwo  = new CoffeeDecorator(new TurnOnComputerDecorator(new StaffTwo()));

        staffOne.work();
        System.out.println();
        staffTwo.work();
    }
}
posted @ 2021-12-30 16:37  努力的Daimon  阅读(36)  评论(0编辑  收藏  举报