- N +

设计模式之修饰者模式

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

导读:

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

文章目录 [+]

什么是修饰者模式

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

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

修饰者模式应用场景

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

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

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

组合和继承的区别

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

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

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

装饰者模式的优缺点

优点

? ? ? ?? ??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
作者授权:除特别说明外,本文由?开源技术之家?原创编译并授权?开源技术之家?刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。

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

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

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

快捷回复:

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

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