Java 设计模式_装饰器模式
本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.youkuaiyun.com/Rozol/article/details/76223413
装饰模式可以动态的给一个对象增加一些额外的功能(增强功能)
相比于继承,装饰模式能对不支持继承的类进行增强; 并且比继承更灵活, 不需要生成大量的子类
装饰器模式
public interface Phone {
public abstract void call();
}
public final class PhoneImpl implements Phone{
@Override
public void call(){
System.out.println("手机可以打电话啦");
}
}
- 有一个类(PhoneImpl) 为了不被子类修改而被final修饰, 现在需要对call方法进行功能增强 我们定义了 Phone 接口, 里面写了希望被增强的方法call
public abstract class PhoneDecorate implements Phone{
private Phone mPhone;
public PhoneDecorate(Phone phone){
this.mPhone = phone;
}
@Override
public void call(){
this.mPhone.call();
}
}
- 我们定义了一个装饰器, 用于增强功能的类需要继承该装饰器
public class CameraPhoneDecorate extends PhoneDecorate{
public CameraPhoneDecorate(Phone p){
super(p);
}
@Override
public void call(){
super.call();
System.out.println("手机可以拍照啦");
}
}
public class MusicPhoneDecorate extends PhoneDecorate{
public MusicPhoneDecorate(Phone p){
super(p);
}
@Override
public void call(){
System.out.println("手机可以听铃声了");
super.call();
}
}
- 比如部分功能特别强的 拍照手机 和 音乐手机, 都是对普通手机的call进行了增强
使用
public class Test {
public static void main(String[] args) {
// 普通手机
Phone phone = new PhoneImpl();
phone.call();
print("=");
// 音乐手机
PhoneDecorate phoneDecorate = new MusicPhoneDecorate(phone);
phoneDecorate.call();
print("=");
// 拍照手机
phoneDecorate = new CameraPhoneDecorate(phone);
phoneDecorate.call();
print("=");
// 音乐与拍照手机
phoneDecorate = new CameraPhoneDecorate(new MusicPhoneDecorate(phone));
phoneDecorate.call();
// 装饰模式在IO流中的运用
// BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
}
private static void print(String string) {
System.out.println("=======================");
}
}
- 可见被final修饰的类的call功能被增强了
- 而且生成的类比直接用继承的方法生成的子类更少,更简洁