Decorator Pattern

装饰模式 :动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类扩展功能更为灵活

通过采用组合、而非继承的手法, Decorator 模式实现了在运行时动态的扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了单独使用继承带来的“灵活性差”和“多子类衍生问题”

JAVA IO 流的设计就大量运用了装饰模式。看看我们熟悉的代码 :

BufferedReader br= new BufferedReader(
                        new InputStreamReader(new FileInputStream("..")));层层包装,增强功能。

Decorator Pattern_第1张图片


示例:
接口或抽象类Computer(Component)、它的实现IBMComputer(ConcreteComponent)、
装饰角色ComputerDecorator(Decorator)、具体装饰角色GameComputerDecorator、SingComputerDecorator

Computer.java
package cn.nevo.pattern.decorator;
/**
 * Component角色
 */
public interface Computer {
	public void operator();
}
IBMComputer.java
package cn.nevo.pattern.decorator;
/**
 * ConcreteComponent角色
 */
public class IBMComputer implements Computer {

	public void operator() {
		System.out.println("IBM电影功能");
	}
}
ComputerDecorator.java
package cn.nevo.pattern.decorator;
/**
 * 装饰角色
 */
public class ComputerDecorator implements Computer {

	private Computer computer;
	
	public ComputerDecorator(Computer computer) {
		this.computer = computer;
	}
	
	public void operator() {
		this.computer.operator();
	}
}

GameComputerDecorator.java
package cn.nevo.pattern.decorator;
/**
 * 具体装饰角色,增加游戏功能
 */
public class GameComputerDecorator extends ComputerDecorator {
	public GameComputerDecorator(Computer computer) {
		super(computer);
	}
	
	@Override
	public void operator() {
		super.operator();
		System.out.println("IBM游戏功能");
	}
}
SingComputerDecorator.java
package cn.nevo.pattern.decorator;
/**
 * 具体装饰角色,增加放歌功能
 */
public class SingComputerDecorator extends ComputerDecorator {
	public SingComputerDecorator(Computer computer) {
		super(computer);
	}
	
	@Override
	public void operator() {
		super.operator();
		System.out.println("IBM放歌功能");
	}
}
客户端测试ClientTest.java
public class ClientTest {

	public static void main(String[] args) {
		System.out.println("原始功能:");
		Computer computer = new IBMComputer();
		computer.operator();
		
		System.out.println("装饰Game功能:");
		ComputerDecorator cd = new GameComputerDecorator(computer);
		cd.operator();
		
		System.out.println("装饰Sing功能:");
		ComputerDecorator cdt = new SingComputerDecorator(computer);
		cdt.operator();
	}
}

输出
原始功能:
IBM电影功能
装饰Game功能:
IBM电影功能
IBM游戏功能
装饰Sing功能:
IBM电影功能
IBM放歌功能

你可能感兴趣的:(Decorator Pattern)