Example #1
0
int main()
{
    string dictionary[4][6] = {{"Garden", "pot.jpg", "spring.jpg", "barbeque.jpg", "flowers.jpg", ""},
                             {"Italy", "cappucino.jpg", "pasta.jpg", "restaurant.jpg", "church.jpg", ""},
                             {"Food", "pasta.jpg", "veggies.jpg", "barbeque.jpg", "cappucino.jpg", "lemonade.jpg"},
                             {"Friends", "restaurant.jpg", "dinner.jpg", "", "", ""}};
    FlyweightFactory *album = new FlyweightFactory();
    for (int r = 0; r < 4; r++)
    {
        for (int c = 1; c < 6; c++)
        {
            if (dictionary[r][c] != "")
                album->get_flyweight(dictionary[r][c]);
        }
    }

    for (int r = 0; r < 4; r++)
    {
        for (int c = 0; c < 6; c++)
        {
            if (c == 0)
                cout << "<<" << dictionary[r][c] << ">>" << endl;
            else if (dictionary[r][c] != "")
                cout << album->get_flyweight(dictionary[r][c])->display() << "  ";
        }
        cout << endl;
    }

    delete album;
    return 0;
}
int main(int argc, char* argv[]) {
  FlyweightFactory* fc = new FlyweightFactory();
  Flyweight* fw1 = fc->GetFlyweight("hello");
  Flyweight* fw2 = fc->GetFlyweight("world!");
  Flyweight* fw3 = fc->GetFlyweight("hello");
  return 0;
}
Example #3
0
///Flyweight 享元模式中有一个类似 Factory 模式的对象构造工厂FlyweightFactory,当客户程序员(Client)需要一个对象时候就会向 FlyweightFactory 发出 请求对象的消息 GetFlyweight()消息,FlyweightFactory 拥有一个管理、存储对象的“仓 库”(或者叫对象池,vector 实现),GetFlyweight()消息会遍历对象池中的对象,如果已 经存在则直接返回给 Client,否则创建一个新的对象返回给 Client。
void FlyweightTest() {
FlyweightFactory* fc = new FlyweightFactory();
    Flyweight* fw1 = fc->GetFlyweight("hello");
    Flyweight* fw2 = fc->GetFlyweight("world!");
    Flyweight* fw3 = fc->GetFlyweight("hello");
    void(fw1||fw2||fw3);
}
Example #4
0
int main(void) {
  FlyweightFactory fly =  FlyweightFactory::getInstance();
  std::cout << fly.getFlyweight("hoge") << std::endl;
  std::cout << fly.getFlyweight("ho") << std::endl;
  std::cout << fly.getFlyweight("hoge") << std::endl;
  return 0;
}
Example #5
0
int main(int argc, char* argv[])
{
    FlyweightFactory factory;
    Flyweight* fw = factory.getFlyweight("one");
    fw->operation();

    Flyweight* fw2 = factory.getFlyweight("two");
    fw2->operation();
    //aready exist in pool
    Flyweight* fw3 = factory.getFlyweight("one");
    fw3->operation();
    return 0;
}
Example #6
0
void test_flyweight()
{
	FlyweightFactory* fc = new FlyweightFactory;

	Flyweight* fw1 = fc->GetFlyweight("hello");
	Flyweight* fw2 = fc->GetFlyweight("world");
	Flyweight* fw3 = fc->GetFlyweight("hello");

	fw1->Operation("Lucy");
	fw2->Operation("Lily");
	fw3->Operation("Samao");

	delete fc;
}
Example #7
0
int main()
{
	FlyweightFactory factory;
	
	set<string> colors{ "red", "green", "blue" };
	set<string> shades{ "pale", "dark", "light" };

	for (auto &s: shades)
		for (auto &c : colors)
		{
			Flyweight &flyweight = factory.getFlyweight(c);
			cout << flyweight.doSomething(s) << endl;
		}

	cout << "getFlyweightsNumber :";
	cout << factory.getFlyweightsNumber() << endl;

	cin.get();

	return 0;
}
Example #8
0
//适配器模式是在类已经设计好后实施
//桥接模式在设计类之前实施
//外观模式定义一个新接口
//适配器模式是复用原有的接口, 即适配器模式是使两个原有的接口协同工作, 而不是定义一个全新的接口
int main()
{
	//适配器模式:客户欲使用的功能与已有类Adaptee相同,但客户已知接口与Adaptee不同,
	//			 此时由于特殊原因无法修改Adaptee的接口,和客户使用接口的代码。
	//			 则创建一个适配接口的类Adapter,含有Adaptee的实例,接口声明为客户待使用的接口。
	//			 在Adapter实现中调用功能相同的Adaptee的方法
	Adapter a;
	Client c(&a);
	c.Do();


	//桥接模式:impl技法 抽象接口与实现分离,各自独立变化互不影响
	//			实现改变时不影响客户代码使用
	//			接口改变,功能不变时实现代码不需变化
	Abstraction abs;
	abs.Foo();
	abs.Bar();

	//组合模式:需求中是体现部分与整体层次的结构时,又希望用户可以忽略组合对象与单个对象的不同
	//		   统一地使用组合结构中的所有对象时
	//透明方式和安全方式
	PartA pa("PartA");
	PartB pb("PartB");
	CompanyA ca("rootCompany");
	ca.AddPart(&pa);
	ca.AddPart(&pb);
	ca.Display(1);

	//装饰模式:动态地给一个对象添加一些额外的额职责,就增加功能来说,装饰模式比生成子类更为灵活
	//优点:把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象。因此,当需要执行特殊行为时,
	//客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象。
	//有效地把类的核心职责和装饰功能区分开了,可以去除相关类中重复的装饰逻辑
	//装饰----当系统需要新功能的时候,是向旧的类中添加新的代码,例如:新的字段,新的方法和新的逻辑
	//这些新加的代码通常装饰了原有类的核心职责或主要行为
	ConcreteComponent cct;
	DecoratorShow(&cct);

	//外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
	//完美体现依赖倒转, 迪米特法则
	//使用时机:
	//1.设计初期,不同的层分离,层与层之间建立外观Facade
	//2.开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观可以提供一个简单的接口,减少它们之间的依赖.
	//3.维护阶段,为新系统开发一个外观类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互
	//			Facade对象与旧系统的遗留代码交互所有复杂的工作
	Facade facade;
	facade.Foo();
	facade.Bar();

	//享元模式:	如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,
	//			如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象
	//例:.net中String; 休闲游戏中的棋子对象
	//缺点:使用享元模式需要维护一个记录了系统已有的所有享元的列表,本身需要耗费资源,也使系统更加复杂
	FlyweightFactory ff;
	auto f1 = ff.GetFlyweight("ABC");
	f1->Operation();
	auto f2 = ff.GetFlyweight("DEF");
	f2->Operation();
	auto f3 = ff.GetFlyweight("ABC");
	f3->Operation();

	int count = ff.GetInstanceCount();

	//代理模式:为其他对象提供一种代理以控制这个对象的访问
	//1.远程代理
	//2.虚代理
	//3.保护代理
	//4.智能指针
	//
}
Example #9
0
int main(int argc, char *argv[])
{
	CSingleton *one = CSingleton::getInstance();	

	cout << "<<< Factory pattern >>>" << endl;
	Factory *fact = new DeriveFactory();
	Product *p1 = fact->createProduct();
	p1->display();

	AbstractFactory *abs1One = new Group1Factory();
	abs1One->createProductA();
	abs1One->createProductB();

	AbstractFactory *abs2One = new Group2Factory();
	abs2One->createProductA();
	abs2One->createProductB();

	Reciever *pRev = new Reciever();
	Command *pComm = new SubCommand(pRev);
	Invoke in(pComm);
	in.Action();

	Command *pComm2 = new SimpleCommand<Reciever>(pRev, &Reciever::Action);
	pComm2->act();
	cout << "<<< Facade pattern >>>" << endl;
	Facade *fa = new Facade();
	fa->operate();

	cout << "<<< Flyweight pattern >>>" << endl;
	FlyweightFactory *fwFactory = new FlyweightFactory();
	fwFactory->GetFlyweight("hello")->opt("world");
	fwFactory->GetFlyweight("haha")->opt("!!!");
	fwFactory->GetFlyweight("hello")->opt("world2");

	cout << "<<< Proxy pattern >>>" << endl;
	SubSubject *pSub = new SubSubject();
	Proxy *p2 = new Proxy(pSub);
	p2->request();

	cout << "<<< prototype pattern >>>" << endl;
	Prototype *prot = new SubPrototype();	
	Prototype *prot2 = prot->clone();

	cout << "<<< observer pattern >>>" << endl;
	OSubject *pOSub = new SubOSubject();
	ObserverA *pObA = new ObserverA();
	ObserverB *pObB = new ObserverB();
	pOSub->attach(pObA);
	pOSub->attach(pObB);
	pOSub->SetState("old");
	pOSub->notify();
	pOSub->SetState("new");
	pOSub->notify();
	
	cout << "<<< visitor pattern >>>" << endl;
	Visitor *pV = new SubVisitorA();
	Element *pE = new ElementA();
	pE->accept(pV);

	cout << "<<< state pattern >>>" << endl;
	State *pS = new StateA();
	Context *pSub3 = new Context(pS);
	pSub3->Operate();
	pSub3->Operate();
	pSub3->Operate();
	return 0;
}
Example #10
0
int main()
{
    IComponent<string>* album = new Composite<string>(string("Album"));
    IComponent<string>* point = album;
    FlyweightFactory<string>* dictonary = new FlyweightFactory<string>();
    string command, parameter;
    FILE* fin;
    if ((fin = fopen("composite.dat", "r")) == NULL)
    {
        cout << "composite.dat not exist" << endl;
        return 1;
    }
    string t;
    char buf[100];
    do
    {
        t = fgets(buf, 100, fin);
        cout << "\t\t\t\t" + t;
        int pos = t.find(" ");
        if (pos == string::npos)
        {
            command = t.substr(0, t.size()-1);
        }
        else
        {
            command = t.substr(0, pos);
            parameter = t.substr(pos+1, t.size() - pos - 2);
            //cout << parameter << endl;
        }
        if (command == "AddSet")
        {
            IComponent<string>* c = dictonary->get_flyweight(parameter, true);
            point->add(c);
            point = c;
        }
        else if (command == "AddPhoto")
        {
            IComponent<string>* c = dictonary->get_flyweight(parameter, false);
            point->add(c);
        }
        else if (command == "Remove")
        {
            point = point->remove(parameter);
        }
        else if (command == "Find")
        {
            point = album->find(parameter);
        }
        else if (command == "Display")
        {
            cout << album->display(0) << endl;
        }
        else if (command == "Quit")
        {
            break;
        }
    }while (command != "Quit");

    delete album;
    delete dictonary;
    fclose(fin);
    return 0;
}