设计模式之装饰模式

什么叫装饰模式?

我们知道,如果想对某个类进行功能扩充,一般就会想到使用继承(对拓展开放,对修改关闭的开闭原则)。如果我们不使用继承的话还有没有其他方式来实现呢?答案是有的:就是使用装饰模式;
装饰模式也叫做包装模式,结构型设计模式之一。可以用来动态透明的方式来拓展对象的功能。可以看做是继承关系的一种补充(替代)。

装饰模式的定义

动态的为一个对象添加一些额外的职责。就增加功能来说,装饰模式相比继承更为灵活

装饰模式的简单实现

  1. 首先创建一个用于被装饰的抽象类person

    public abstract class Person {
    //定义一个穿着的抽象方法
    public abstract void dressed();
    }
  2. 第二步创建被装饰的实体类boy,该类继承person,实现了其中的方法

    public class Boy extends Person {
    @Override
    public void dressed() {
        System.out.println("男孩穿了内裤");
    }
    }
  3. 创建装饰者的抽象类PersonCloth,该类继承Person类,保持一个person类的引用

    //抽象的装饰者,持有一个Person抽象类(基类)的引用
    public class PersonCloth extends Person {
    private Person mPerson;
    
    public PersonCloth(Person person) {
        mPerson = person;
    }
    
    @Override
    public void dressed() {
        //调用Person的dressed方法
        mPerson.dressed();
    }
  4. 接下来我们就可以创建实际的装饰者类了,显而易见,该类需要继承PersonCloth。我们创建两个装饰类:CheapCloth、ExpensiveCloth:

    • CheapCloth.java

      public class CheapCloth extends PersonCloth {
      public CheapCloth(Person person) {
          super(person);
      }
      
      private void dressShirt() {
          System.out.println("穿件便宜的短袖");
      }
      
      private void dressJean() {
          System.out.println("穿着便宜的牛仔裤");
      }
      
      @Override
      public void dressed() {
      //增强的dressed方法
          super.dressed();
          dressShirt();
          dressJean();
      }
    • ExpensiveCloth.java

      public class ExpensiveCloth extends PersonCloth {
      public ExpensiveCloth(Person person) {
          super(person);
      }
      
      private void dressShirt() {
          System.out.println("穿件昂贵短袖");
      }
      
      private void dressJean() {
          System.out.println("穿着昂贵的牛仔裤");
      }
      
      @Override
      public void dressed() {
      //增强的dressed方法
          super.dressed();
          dressShirt();
          dressJean();
      }

    上面的这两个类都继承了抽象类PersonColth类,从代码中我们可以看到,这两个类“丰富”了原来的dressed方法,实现了动态增加功能的预期。

  5. main函数调用

    public class MainTest {
        public static void main(String[] args) {
            Person person = new Boy();
    
            //使用装饰者:穿上便宜的衣服
            PersonCloth colthCheap = new CheapCloth(person);
            colthCheap.dressed();
            System.out.println("~~~~~~~~~~~~~~~~~~");
            //使用装饰者:穿上昂贵的衣服
            PersonCloth colthExpensive = new ExpensiveCloth(person);
            colthExpensive.dressed();
        }
    }

    以上代码很简单,我们直接看打印的结果:

    男孩穿了内裤
    穿件便宜的短袖
    穿着便宜的牛仔裤
    ~~~~~~~~~~~~~~
    男孩穿了内裤
    穿件昂贵短袖
    穿着昂贵的牛仔裤

总结

装饰模式并不复杂,其本质更像是一种对类的封装还有调用。装饰模式和代理模式很相似,但是却比代理模式稍微复杂点。装饰模式是以对客户端透明的方式扩充对象的功能,是继承关系的一种替代方案。并可以对所装饰的对象增强其功能;代理模式的核心是指给一个对象提供一个代理对象,并由代理对象控制对原有对象的引用,并不能增强原对象的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值