七、装饰模式

装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。

装饰器模式的应用场景:
1、需要扩展一个类的功能。
2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
缺点:产生过多相似的对象,不易排错!

java:

package com.shuang.decorator;


interface Sourceable{
	public void method();
}
class Source implements Sourceable{

	@Override
	public void method() {
		System.out.println("method");
	}
	
}
class Decorator implements Sourceable{
	private Sourceable sourceable;
	public Decorator(Sourceable sourceable) {
		this.sourceable=sourceable;
	}
	@Override
	public void method() {
		System.out.println("before decorator!");
		sourceable.method();
		System.out.println("after decorator");
	}
	
}
public class DecoratorTest {
	public static void main(String[] args) {
		Sourceable sourceable=new Source();
		Sourceable obj=new Decorator(sourceable);
		obj.method();
	}
}

 c++

#include<iostream>
using namespace std;
class Car
{
public:
	virtual void show()=0;
};
class RunCar:public Car
{
public:
	virtual void show()
	{
		cout<<"可以跑"<<endl;
	}
};
class SwimCarDirector:public Car
{
public:
	SwimCarDirector(Car *car){
		m_car=car;
	}
	void swim()
	{
		cout<<"可以游"<<endl;
	}
	virtual void show()
	{
		m_car->show();
		swim();
	}
private:
	Car *m_car;
};
class FlyCarDirector:public Car
{
public:
	FlyCarDirector(Car *car){
		m_car=car;
	}
	void fly()
	{
		cout<<"可以飞"<<endl;
	}
	virtual void show()
	{
		m_car->show();
		fly();
	}
private:
	Car *m_car;
};
int main()
{
	Car *mycar=NULL;
	mycar=new RunCar;
	mycar->show();
	printf("-------------------\n");

	FlyCarDirector *flycar=new FlyCarDirector(mycar);
	flycar->show();

	printf("-------------------\n");

	SwimCarDirector *swimcar=new SwimCarDirector(flycar);
	swimcar->show();

	delete swimcar;
	delete flycar;
	delete mycar;

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/shuangyueliao/article/details/81842550