• 设计模式(3)装扮你的类(装饰模式)


    首先看看书上的例子吧!人穿衣服的例子!

    类图就不画了,就是简单的类结构。

    代码如下:

    #include <iostream>
    
    using namespace std;
    
    class person{
    private:
    	string name;
    public:
    	person(string name){
    		this->name = name;
    	}
    
    	void wearTShirts(){
    		cout<<"大T恤"<<endl;
    	}
    
    	void wearBigTrouser(){
    		cout<<"跨裤"<<endl;
    	}
    
    	void wearSneakers(){
    		cout<<"破球鞋"<<endl;
    	}
    
    	void wearSuit(){
    		cout<<"西装"<<endl;
    	}
    
    	void wearTie(){
    		cout<<"领带"<<endl;
    	}
    
    	void wearLeatherShoes(){
    		cout<<"皮鞋"<<endl;
    	}
    
    	void show(){
    		cout<<"装扮的"<<name.c_str()<<endl;
    	}
    };
    
    int main(int argc, char* argv[])
    {
    	person* p = new person("小张");
    	cout<<"第一种装扮"<<endl;
    	p->wearLeatherShoes();
    	p->wearSuit();
    	p->wearBigTrouser();
    	p->show();
    	cout<<"第二种装扮"<<endl;
    	p->wearLeatherShoes();
    	p->wearTShirts();
    	p->wearSneakers();
    	p->show();
    	return 0;
    }
    

    如果要新添加一种装扮,那么就需要修改person类的结构,这样就违反了开闭原则

    那就先做抽象好了,把变化的抽象出来,于是类图结构如下

     对应这个实现上面的程序,好像是方便了一些,但是如果继续增加需求呢?就会出现很多的子类。

    从而引出装饰模式

    装饰模式是动态的给对象增加一些属性和职责

    类结构如下

    Componment是定义的一个对象接口,可以给这些对象动态的添加职责

    ConcertComponent是要被装饰的对象,即原始对象

    Dectorator是装饰抽象类

    ConcertDectoratorA和ConcertDectoratorB是具体的装饰对象。

    看看原来的类图修改如下

    这样,就可以实现对人对象的动态装载,不过,这个例子举得感觉不是很好,没有列出装饰模式的精髓。

    作者:张锋
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
    更多精彩文章可以观注
    微信公众号 soft张三丰

    微信交流群,添加群主微信,邀请入群
  • 相关阅读:
    echarts pie 图表 显示的label 中内容 字体大小自定义
    echarts pie 图表当名称太长时
    一个大屏监控的项目
    Web前端优化最佳实践及工具集锦
    分享网页到微信朋友圈的官方接口
    Explaining Delegates in C#
    Explaining Delegates in C#
    Explaining Delegates in C#
    Explaining Delegates in C#
    Explaining Delegates in C#
  • 原文地址:https://www.cnblogs.com/skyme/p/2014918.html
Copyright © 2020-2023  润新知