zoukankan      html  css  js  c++  java
  • 第6章装饰模式

    一 概念

    • 装饰模式,动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

    二 UML图

    三 装饰模式总结

    • 装饰模式是为已有功能动态的添加更多功能的一种方式,当系统需要新功能的时候,是向旧类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为,但是这种做法的问题在于,他们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。而这些新加入的东西紧紧是为了满足一些只在某些特定情况下才会执行的特殊行为的需求。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它要装饰的对象,因此,当执行特殊行为时,客户代码就可以在运行时根据需要有选择的,按顺序的使用装饰功能包装对象了。

    四 C++代码实现

    #include "pch.h"
    #include <iostream>
    #include <string>
    using namespace std;
    //Person类 ConcreteComponent
    class Person
    {
    public:
    	Person()
    	{
    	}
    	Person(string str)
        {
    		this->name = str;
    	}
    	virtual void Show()
    	{
    		cout << "装扮的: " << this->name << endl;
    	}
    
    private:
    	string name;
    };
    
    class Finery : public Person
    {
    public:
    	void Decorate(Person* component)
    	{
    		this->component = component;
    	}
    	void Show() override
    	{
    		if (this->component != nullptr)
    		{
    			this->component->Show();
    		}
    	}
    protected:
    	Person* component;
    };
    
    //具体服饰类 ConcreteDecorator
    class TShirts : public Finery
    {
    public:
    	void Show() override
    	{
    		cout << "大T恤" << endl;
    		Finery::Show();
    	}
    };
    
    class BigTrouser : public Finery
    {
    public:
    	void Show() override
    	{
    		cout << "垮裤" << endl;
    		Finery::Show();
    	}
    };
    
    class Sneakers : public Finery
    {
    public:
    	void Show() override
    	{
    		cout << "破球鞋" << endl;
    		Finery::Show();
    	}
    };
    
    class Suit : public Finery
    {
    public:
    	void Show() override
    	{
    		cout << "西装" << endl;
    		Finery::Show();
    	}
    };
    
    class Tie : public Finery
    {
    public:
    	void Show() override
    	{
    		cout << "领带" << endl;
    		Finery::Show();
    	}
    };
    
    class LeatherShoes : public Finery
    {
    public:
    	void Show() override
    	{
    		cout << "皮鞋" << endl;
    		Finery::Show();
    	}
    };
    
    int main()
    {
    	Person* xc = new Person("小菜");
    	Person buffer[10];
    
    	cout << "
    第一种装扮:
    ";
    
    	Sneakers* pqx = new Sneakers;
    	BigTrouser* kk = new BigTrouser;
    	TShirts* dtx = new TShirts;
    
    	pqx->Decorate(xc);
    	kk->Decorate(pqx);
    	dtx->Decorate(kk);
    	dtx->Show();
    
    	return 0;
    }
    
    
  • 相关阅读:
    基于JSP+SERVLET的新闻发布系统(三)
    linux date
    试论知识工作者的任务分析
    SRM 577 Div II Level Two: EllysRoomAssignmentsDiv2
    UNIX环境高级编程——TCP/IP网络编程
    是时候抛弃web.xml了?
    使用Spring Boot Actuator、Jolokia和Grafana实现准实时监控--转
    spring-security-oauth2注解详解
    一张图了解javaJwt
    nginx假死导致的问题回顾
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/11136252.html
Copyright © 2011-2022 走看看