结构型设计模式

一、代理模式

代理模式结构体

代理模式:为其他对象提供一种代理以控制对这个对象的访问。

abstract class Base{

public abstract void method();

}

class Source: public Base{

public method(){

Console.WriteLine("真实的实体类");

}

}

class Proxy:public Base{

Source source;

public method(){

if(source==null){

source=new Source();

}

source.method();

}

}

client:

static void Main(Stirng []args){

Proxy proxy=new Proxy();

proxy.method();

Closole.Read();

}

代理模式的应用:

第一,远程代理,也就是为一个对象在不同的地址空间提供局部代表。可以隐藏一个对象存在不同地址空间的事实。

第二,虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。

第三,安全代理,用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。

第四,智能指引,是指当调用真实的对象时,代理处理另外一些事。

二、适配器

将某个类的接口转换成用户可以接受的接口

接口不匹配的类间通信

通过中间的适配器使得客户端可以间接地访问他想访问而不能直接访问到的对象

class Adaptee{

public:

void adapteeprion(){

cout<<"aaptee"<<endl;

}

};

class Adapter{

private:

Adaptee * objadaptee;

public:

void Adapter(){

objadaptee=new Adaptee();

}

void adapterprion(){

objadaptee->adapteeprion();

}

~Adapter (){

delete();

}

};

//client:

Adapter *adapter=new Adapter();

adapter->adapterprion();

class Adaptee{

public:

void adapteepro(int i){

cout<<"adapteepro"<<endl;

}

};

class AdapterBase{

public:

virtual void adapterpro()=0;

virtual ~AdapterBase(){}

};

class AdapterA:public AdapterBase{

public:

void adapterpro(){

cout<<"adapterpro A"<<endl;

}

};

class AdapterB:public AdapterBase{

private:

Adaptee * ptee;

public:

AdapterB(){

ptee=new Adaptee();

}

void adapterpro(){

ptee->adaptee(3);

}

~AdapterB(){

delete ptee;

}

};

class AdapterC:public AdapterBase{

public:

void adapterpro(){

cout<<"adapterpro B"<<endl;

}

};

//client;

AdapterBase * base=new AdapterB();

base->adapterpro();

delete base;

三、组合通信模式

·将对象组合成树形结构以表示“部分-整体”,的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

组合通信结构图

公司类 抽象类或接口

abstract class Company{

protected string nam;

public Company(Stirng name){

this.name=name;

}

public abstract void Add(Company c);//增加

public abstract void Remove(Company c);//移除

public abstract void Display(int depth);//显示

public abstract void LineOfDuty();//履行职责

}

具体公司类 实接口 树枝结点

class ConcreteCompany:Company

{

private List<Company> children=new List<Company>();

public ConcreteCompany(String name):base(name);

{ }

public override void Add(Company c){

children.Add(c);

}

public override void Remove(Company c){

childre.Remove(c);

}

public override vodi Display(int depth){

Console.WriteLine(new Stirng('-'depth)+name);

foreach(Company component in children){

component .Display(depth+2);

}

}

public override void LineOfDuty(){

foreach(Company companent in children){

companent.LineOfDuty();

}

}

}

//人力资源部与财务部 树枝节点

class HRDepartment :Company{

public HRDepartment(Stirng name):base(name){

}

public override void Add(Company c){ }

public override void Remove(Company c){ }

public override void Display(int depth){

Console.WriteLine(new Stirng('-',depth)+name);

}

public override void LineDuty(){

Console.WriteLine("{0} 员工招聘培训管理",name);

}

}

//财务部

class FinanceDepartment:Company{

public FinanceDepartment(String name):base(name){ }

public override void Add(Company c){ }

public override void Remove(Company c){ }

public override void Display(int depth){

Console.WriteLine(new String('-',depth)+name);

}

public override void LineOfDuty(){

Consloe.WriterLine("{0}公司财务收支管理",name);

}

}

//client

static vodi Main(String []args){

ConcreteCompany root=new ConcreteCompany("北京总公司");

root.Add(new HRDepartment("总公司人力资源部"));

root.Add(new FInanceDeoartment("总公司财务部"));

 

ConcreteCompany comp=new ConcreteCompany("上海华东分公司");

comp.Add(new HRDepartment("华东分公司人力资源部"));

comp.Add(new FInanceDeoartment("华东分公司财务部"));

root.Add(comp);

 

ConcreteCompany comp1=new ConcreteCompany("南京办事处");

comp1.Add(new HRDepartment("南京办事处人力资源部"));

comp1.Add(new FInanceDeoartment("南京办事处财务部"));

comp.Add(comp1);

 

ConcreteCompany comp2=new ConcreteCompany("杭州办事处");

comp2.Add(new HRDepartment("杭州办事处人力资源部"));

comp2.Add(new FInanceDeoartment("杭州办事处财务部"));

comp.Add(comp2);

}

组合模式的优点:组合模式让客户可以一致地使用组合结构和单个对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值