Java设计模式学习—装饰者模式(Decorator)

装饰者模式:动态的将职责添加到对象上,相比继承来扩展类的功能,装饰者模式更为灵活。
装饰者设计模式设计原则
1)、多用组合,少用继承;继承设计子类的行为在编译时静态决定,所有子类都会继承到相同的行为,如果采用组合的方式,就可以再运行过程中动态的对类进行扩展;
2)、被修饰类对外扩展开放,对修改关闭;
3)、装饰者和被装饰者具有相同的超类型
代码解释:

   /**装饰者与被装饰者的相同超类型**/
   interface SuperClass{
       public void fun();
   }
   /**被装饰者类
     被装饰的类是一个抽象类,抽象类不能实例化,需要通过子类来实例化
    **/
   abstract class DecoratedClass implements SuperClass{
      private SuperClass sc;
      public DecoratedClass(SuperClass sc){
          this.sc = sc;
      }
      public void fun(){
           sc.fun();
       }
  }
  /**装饰者1**/
  class DecoratorOne extends DecoratedClass{
    public DecoratorOne(SuperClass sc){
        super(sc);
    }
    public void fun(){
           super.fun();
           addFun1();
        }
        public void addFun1(){
        }
  }
  /**装饰者2**/
  class DecoratorTwo extends DecoratedClass{
    public DecoratorTwo(SuperClass sc){
        super(sc);
    }
    public void fun(){
           super.fun();
           addFun2();
        }
        public void addFun2(){
        }
  } 
  class SubSuperClass implements SuperClass
  {
       public void fun(){}
  }
  public class DecoratorTest{
     public static void main(String[]args){
          SuperClass sc = new SubSuperClass();
          SuperClass sc1 = new DecoratorOne(sc);
          SuperClass sc2 = new DecoratorTwo(sc1);
          sc2.fun();

     }
  } 


通过该例子我们来分析装饰者如何给被装饰者动态扩展:
step1:sc2调用fun()方法,此时fun方法体调用super.fun(),即DecoratedClass
类的fun方法,该方法用调用超类型的fun()方法,此时超类形的实现是DecoratorOne,即调用的是DecoratorOne的fun方法,该方法里又调用super.fun(),方法体的实现是调用超类的fun(),而此时超类的实现是SubSuperClass,因此调用该类的fun()方法,层层相扣,从SubSuperClass的fun扩展到DecoratorTwo的fun.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值