- N +

设计模式之修饰者模式

设计模式之修饰者模式原标题:设计模式之修饰者模式

导读:

什么是修饰者模式?在不改变原来类的情况下,进行扩展。修饰着模式是动态的给对象增加一个业务功能,就功能来说,比生成子类更方便。修饰者模式应用场景1 在不生成子类的情况下,为对象动...

文章目录 [+]

什么是修饰者模式

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

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

修饰者模式应用场景

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

结果:

烤蒸鸭肉


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

有好的文章希望我们帮助分享和推广,猛戳这里我要投稿

返回列表
上一篇:
下一篇:

发表评论中国互联网举报中心

快捷回复:

    评论列表 (暂无评论,共861人参与)参与讨论

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