Java 设计模式_装饰器模式

Java 设计模式_装饰器模式


本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.csdn.net/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功能被增强了
  • 而且生成的类比直接用继承的方法生成的子类更少,更简洁
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值