#include <iostream> void init(int* ary, int size) for (int i = 0; i < size; ++i) ary[i] = i; void mul10(int* ary, int size) for (int i = 0; i < size; ++i) ary[i] *= 10; void dispary(int* ary, int size) for (int i = 0; i < size; ++i) std::cout << ary[i] << std::endl; int main(void) const int LENGTH = 10; int array[length]; init(array, LENGTH); dispary(array, LENGTH); mul10(array, LENGTH); dispary(array, LENGTH); #include <iostream> class ArrayProcessor public: void doprocess(int* ary, int size) for (int i = 0; i < size; ++i) proc(ary[i], i); protected: // この関数をオーバーライドすることで派生クラスによって処理を切り替えることができる virtual void proc(int& element, int index) = 0; ; class ArrayInitializer : public ArrayProcessor protected: void proc(int& element, int index) element = index; ; class ArrayMultiplier : public ArrayProcessor protected: void proc(int& element, int index) element *= 10; ; class ArrayDisplay : public ArrayProcessor protected: void proc(int& element, int index) std::cout << element << std::endl; ; // 派生クラスの型に合わせてdoProcessの処理が変化 void proc(arrayprocessor& proc, int* ary, int size) proc.doprocess(ary, size); // main int main(void) const int LENGTH = 10; int array[length]; ArrayInitializer init; ArrayDisplay ArrayMultiplier ArrayDetailDisplay dis; multi; del; proc(init, array, LENGTH); proc(dis, array, LENGTH); proc(multi, array, LENGTH); proc(del, array, LENGTH); return 0;
#include <iostream> class Prop public: void propcalc(int* ary, int size) for (int i = 0 ; i<size ; i++) calc(ary[i], i); protected: // この関数をオーバーライドすることで派生クラスによって処理を切り替えることができる virtual void calc(int& element, int index) = 0; ; // ここから派生クラスで実装して使用するときは基底クラスから呼び出す class PropInitializer : public Prop protected: void calc(int& element, int index) element = index; ; class PointSource : public Prop protected: void calc(int& element, int index) element *= 10; ; class WallSource : public Prop protected: void calc(int& element, int index) element *= 100; ; class PropGet : public Prop protected: void calc(int& element, int index) std::cout << element << std::endl; ; // 派生クラスの型に合わせて propcalc の処理が変化 void propagetor(prop& obj_prop, int* ary, int size) obj_prop.propcalc(ary, size); // main int main(void) const int LENGTH = 10; int array[length]; PropInitializer init; PropGet get; WallSource wall; PointSource point; propagetor(init, array, LENGTH); propagetor(wall, array, LENGTH); propagetor(get, array, LENGTH); propagetor(init, array, LENGTH); propagetor(point, array, LENGTH); propagetor(get, array, LENGTH); return 0;
#include <iostream> class Prop public: void propcalc(int* ary, int size) for (int i = 0 ; i<size ; i++) calc_src(ary[i], i); protected: // この関数をオーバーライドすることで派生クラスによって処理を切り替えることができる virtual void calc_src(int& element, int index) = 0; ; // ここから派生クラスで実装して使用するときは基底クラスから呼び出す class PropInitializer : public Prop ; class PointSource : public Prop protected: void calc_src(int& element, int index) std::cout<<"calc point src" << std::endl; element *= 10; ; class WallSource : public Prop protected: void calc_src(int& element, int index) std::cout<<"calc wall src" << std::endl; element *= 100; ; // context class によってインターフェイス (Prop) にアクセス class Context public: // コンストラクタ \ \ Context(Prop* obj_prop, int size) obj_prop_ = obj_prop; size_ = size; array_ = new int[size_](); // デストラクタ ~Context() delete [] array_; free (obj_prop_;) void init() for (int i =0 ; i< size_ ;i ++) array_[i] = i; void PropGet() for(int i =0; i<size_ ;i ++) std::cout << array_[i] << std::endl; void calc() obj_prop_->propcalc(array_,size_); private: Prop* obj_prop_; int* array_; int size_; // 派生クラスの型に合わせて propcalc の処理が変化 ; // main int main(void) const int LENGTH = 10; Context* obj1 = new Context(new WallSource(),LENGTH); Context* obj2 = new Context(new PointSource(),LENGTH); obj1->init(); obj1->calc(); obj2->init(); obj2->calc(); obj1->propget(); obj2->propget(); return 0;
#include <iostream> #include <string> /* Implemented interface. */ class AbstractInterface public: virtual void somefunctionality() = 0; ; /* Interface for internal implementation that Bridge uses. */ class ImplementationInterface public: virtual void anotherfunctionality() = 0; ; /* The Bridge */ class Bridge : public AbstractInterface protected: ImplementationInterface* implementation; public: Bridge(ImplementationInterface* backend) implementation = backend; ; class UseCase1 : public Bridge public: UseCase1(ImplementationInterface* backend) : Bridge(backend) void somefunctionality() std::cout << "UseCase1 on "; implementation->anotherfunctionality(); ; class UseCase2 : public Bridge public: UseCase2(ImplementationInterface* backend) : Bridge(backend) void somefunctionality() std::cout << "UseCase2 on "; implementation->anotherfunctionality(); ; /* Different special cases of the interface. */ /* Different background implementations. */ class Windows : public ImplementationInterface public: void anotherfunctionality() std::cout << "Windows :-" << std::endl; ; class Linux : public ImplementationInterface public: void anotherfunctionality() std::cout << "Linux :-)" << std::endl; ; int main() AbstractInterface *usecase = 0; ImplementationInterface *oswindows = new Windows; ImplementationInterface *oslinux = new Linux; /* First case */ usecase = new UseCase1(osWindows); usecase->somefunctionality(); usecase = new UseCase1(osLinux); usecase->somefunctionality(); /* Second case */ usecase = new UseCase2(osWindows); usecase->somefunctionality(); usecase = new UseCase2(osLinux); usecase->somefunctionality(); return 0; UseCase1 on Windows :- UseCase1 on Linux :-) UseCase2 on Windows :- UseCase2 on Linux :-)
#include <iostream> #include <string> /* Implemented interface. */ class AbstractInterface public: virtual void somefunctionality() = 0; ; /* Interface for internal implementation that Bridge uses. */ class ImplementationInterface public: virtual void anotherfunctionality() = 0; ; /* The Bridge */ class Bridge : public AbstractInterface protected: ImplementationInterface* implementation; public: Bridge(ImplementationInterface* backend) implementation = backend; ; /* Different special cases of the interface. */ class UseCase1 : public Bridge public: UseCase1(ImplementationInterface* backend) : Bridge(backend) void somefunctionality() std::cout << "UseCase1 on "; implementation->anotherfunctionality(); ; class UseCase2 : public Bridge /* Different background implementations. */ class Windows : public ImplementationInterface public: void anotherfunctionality() std::cout << "Windows :-" << std::endl; ; class Linux : public ImplementationInterface public: void anotherfunctionality() std::cout << "Linux :-)" << std::endl; ; int main() AbstractInterface *usecase = 0; ImplementationInterface *oswindows = new Windows; ImplementationInterface *oslinux = new Linux; /* First case */ usecase = new UseCase1(osWindows); usecase->somefunctionality(); usecase = new UseCase1(osLinux); usecase->somefunctionality(); /* Second case */ usecase = new UseCase2(osWindows); usecase->somefunctionality(); usecase = new UseCase2(osLinux); return 0; usecase->somefunctionality(); public: UseCase2(ImplementationInterface* backend) : Bridge(backend) void somefunctionality() std::cout << "UseCase2 on "; implementation->anotherfunctionality(); ;
#include <iostream> class Singleton public: // 唯一のアクセス経路 static Singleton* GetInstance() static Singleton instance; // 唯一のインスタンス return &instance; // あとは このクラス自身が必要なメンバを定義する private: // 生成やコピーを禁止する Singleton() Singleton(const Singleton& rhs); Singleton& operator=(const Singleton& rhs); ; int main() Singleton* obj1 = obj1->getinstance(); Singleton* obj2 = obj2->getinstance(); if(obj1==obj2) std::cout << "same instance"<<std::endl; return 0;
#include <cstring> #include <iostream> using namespace std; //Adaptee class Banner public : Banner(string str) this->string_ = str; void ShowWithParen() cout << string_.c_str() << endl; void ShowWithAster() cout << "*" << string_.c_str() << "*" << endl; private : string string_; ; //Target(interface) class Print public : virtual ~Print(); virtual void PrintWeak() = 0; virtual void PrintStrong() = 0; ; //Adapter class PrintBanner : public Print public : ~PrintBanner() delete banner_; PrintBanner(string str) banner_ = new Banner(str); void PrintWeak() banner_->showwithparen(); void PrintStrong() banner_->showwithaster(); private : Banner * banner_; ; int main() Print *p = new PrintBanner("Hello"); p->printweak(); p->printstrong(); delete p; getchar(); return 0;