初探设计模式:装饰器模式
模式介绍
与代理模式的中介性质有所不同的是,装饰器模式是为了扩展对象的功能,可以针对对象做更为细化的操作
装饰器模式大致分为四种核心角色:
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();
}
}