设计模式之装饰模式

Posted 路过你的全世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之装饰模式相关的知识,希望对你有一定的参考价值。

什么叫装饰模式?

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

装饰模式的定义

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

装饰模式的简单实现

  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();
        
    

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

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

总结

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

以上是关于设计模式之装饰模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式--装饰者模式

架构师之路--装饰模式

架构师之路--装饰模式

架构师之路--装饰模式

设计模式之装饰模式

Java设计模式之——装饰器模式