zoukankan      html  css  js  c++  java
  • 设计模式(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张三丰

    微信交流群,添加群主微信,邀请入群
  • 相关阅读:
    [转] 一封程序员的情书
    [**收集**]实用的网站
    [转] 绝对实用!60款免费软件逐个点评下载
    [*日语学习笔记*] 大家的日语初级1动词活用笔记
    [转] IT人不可不听的10个职场故事
    【转图】从可乐到NIKE 经典logo的web2.0版
    [转] 常用姓氏读法
    [转] 数据库开发个人总结(ADO.NET小结)
    [转] VB十七种可用一行代码完成的技巧
    [转] 程序员爱情观XP版本 (敏捷版本)
  • 原文地址:https://www.cnblogs.com/skyme/p/2014918.html
Copyright © 2011-2022 走看看