本文作者:开源技术之家

设计模式之修饰者模式

开源技术之家 2年前 ( 2018-07-17 ) 1324 抢沙发

什么是修饰者模式?

在不改变原来类的情况下,进行扩展。

修饰着模式是动态的给对象增加一个业务功能,就功能来说,比生成子类更方便。

修饰者模式应用场景

1 在不生成子类的情况下,为对象动态的添加某些操作。

2 处理一些可以撤销的职责。

3 当不能使用生成子类来扩充时。

组合和继承的区别

继承。继承是给一个类添加行为的比较有效的途径。通过使用继承,可以使得子类在拥有自身方法的同时,还可以拥有父类的方法。但是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为的方式和时机。

组合。组合即将一个对象嵌入到另一个对象中,由另一个对象来决定是否引用该对象来扩展自己的行为。这是一种动态的方式,我们可以在应用程序中动态的控制。

与继承相比,组合关系的优势就在于不会破坏类的封装性,且具有较好的松耦合性,可以使系统更加容易维护。但是它的缺点就在于要创建比继承更多的对象。

装饰者模式的优缺点

优点

           1、装饰者模式可以提供比继承更多的灵活性

           2、可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。

           3、通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。

           4、具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。


缺点

           1、会产生很多的小对象,增加了系统的复杂性

           2、这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。

装饰者模式角色

 Component 外部接口,用于定义外部调用的形式。提供默认的处理方法。

   ConcreteComponent  具体的处理类,用于实现operation方法。

   Decorator 装饰类,内部关联一个component对象,调用其operation方法,并添加自己的业务操作。

装饰者模式代码示例

装饰者基类:Food接口(Component

/**
 * 装饰者基类
 
 * @author Mayou18
 *
 */
public interface Food {
        
      public  String getDesc();
      
}


/**
 * 鸡肉
 * @author yuanye-ds
 *
 */
public class Chicken extends Food{
    
    
    Chicken(){
        
        desc="鸡肉";
    }

    @Override
    public String getDesc() {
        // TODO Auto-generated method stub
        return desc;
    }

}

/**
 * 鸭肉
 * @author yuanye-ds
 *
 */
public class Duck extends Food{
    
    Duck(){
        
        desc="鸭肉";
    
    }

    @Override
    public String getDesc() {
        // TODO Auto-generated method stub
        return desc;
    }

}

装饰者基类:

/**
 * 装饰者基类
 * @author yuanye-ds
 *
 */
public abstract class FoodDecoration extends Food{
    
    
    @Override
    public abstract String getDesc();

}

修饰类:

/**
 * 修饰类---蒸
 * 
 * @author yuanye-ds
 *
 */
public class SteamedFood extends FoodDecoration{
    
    private Food food;
    
    SteamedFood(Food food){
        
        this.food=food;
    }
    

    @Override
    public String getDesc() {
        // TODO Auto-generated method stub
        return this.getDecoration()+food.getDesc();
    }
    
    private String getDecoration(){
                
        return "蒸";
    
    }

}

/**
 * 烤 修饰类
 * @author yuanye-ds
 *
 */
public class RoastFood extends FoodDecoration{
    
    Food food;
    
    RoastFood(Food food){
        
        this.food=food;
    }
    

    @Override
    public String getDesc() {
        // TODO Auto-generated method stub
        return getDecoration()+food.getDesc();
    }
    
    private String getDecoration(){
        
        return "烤";
    
    }

}

client:

public static void main(String[] args) {
        Duck duck=new Duck();
        
        SteamedFood f=new SteamedFood(duck);
        
        RoastFood r=new RoastFood(f);
        
        
        System.out.println(r.getDesc());
        
    }

结果:

烤蒸鸭肉


本文标题:设计模式之修饰者模式
本文链接:https://www.kyjszj.com/wdzl/23.html
作者授权:除特别说明外,本文由 开源技术之家 原创编译并授权 开源技术之家 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。
文章版权及转载声明

作者:开源技术之家本文地址:https://www.kyjszj.com/wdzl/23.html发布于 2年前 ( 2018-07-17 )
文章转载或复制请以超链接形式并注明出处开源技术之家

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,1324人围观)参与讨论

还没有评论,来说两句吧...