Java编程开发设计模式之--装饰者模式(Decorator)与代理模式(Proxy)
来源:互联网 发布:淘宝皇冠多少信誉 编辑:程序博客网 时间:2024/05/22 14:34
装饰者模式(Decorator)与代理模式(Proxy)
装饰者模式(Decorator)是给一个已知对象动态增加一些必要的功能方法,并需保证被装饰对象与装饰者实现的是相同接口,设计思想是装饰者持有一个被装饰对象的实例。举一个现实中的应用场景例子,您买了一套毛坯房,现在想要装修,可对装饰房屋的具体工作无法自己一个人做好,那么你可以将这套房子,托付给房屋装修公司,让其帮您,按照其提供的一整套流程(设计,选材,人工分派,施工,验收,交付等等。。)去装修房子。代理模式(Proxy),核心思路是,创建一个代理类,替原对象完成一些功能操作,比如您有意愿在某城区买一套房子时,可能就会想到去找一个房屋中介,因为您可能对这个地区的房源信息掌握的不多,而中介公司对这方面更熟悉,此处的代理就是这个概念。用功能实现上来看装饰者模式与代理模式很相似,但现实中却分别独立存在,因为它们在某些层面上来说是有分别存在的意义的,它们之间的区别后面会讲到。装饰者模式(Decorator)
先来看类图:
装修接口Decoratable :
public interface Decoratable { public void decorat();}
毛坯房屋类NewHouse实现接口Decoratable :
public class NewHouse implements Decoratable{ @Override public void decorat() { System.out.println(String.format("%s.%s called!", this.getClass().getName(), "decorat()")); }}
装修公司类DecoratCompany 实现接口Decoratable并持有一个NewHouse实例:
public class DecoratCompany implements Decoratable { private NewHouse newHouse = null; public DecoratCompany(NewHouse newhouse) { newHouse = newhouse; } @Override public void decorat() { if (null != newHouse) { design(); newHouse.decorat(); deliver(); } } private void design() { System.out.println(String.format("%s.%s called!", this.getClass().getName(), "design()")); } private void deliver() { System.out.println(String.format("%s.%s called!", this.getClass().getName(), "deliver()")); }}
测试类:
public class WorkClass { public void test() { NewHouse newHouse =new NewHouse(); DecoratCompany decoratCompany = new DecoratCompany(newHouse); decoratCompany.decorat(); }}
输出结果:
I/System.out: com.example.qinghua_liu.myapplication.designpatten.struct.adapt.DecoratCompany.design() called!
I/System.out: com.example.qinghua_liu.myapplication.designpatten.struct.adapt.NewHouse.decorat() called!
I/System.out: com.example.qinghua_liu.myapplication.designpatten.struct.adapt.DecoratCompany.deliver() called!
- 代理模式(Proxy)
代理模式就是多一个代理类出来,替原对象进行一些操作,并进行必要的前期与后期操作。类图如下:
先创建一个Purchasable接口
public interface Purchasable { public void purchase();}
HouseBuyer类实现Purchasable接口:
public class HouseBuyer implements Purchasable { @Override public void purchase() { System.out.println(String.format("%s.%s called!", this.getClass().getName(), "purchase()")); }}
代理中介类HouseProxy 实现Purchasable接口,并持有一个HouseBuyer 的实例:
public class HouseProxy implements Purchasable { private HouseBuyer houseBuyer; public HouseProxy() { houseBuyer = new HouseBuyer(); } @Override public void purchase() { if (null != houseBuyer) { search(); houseBuyer.purchase(); transfer(); } } private void search() { System.out.println(String.format("%s.%s called!", this.getClass().getName(), "search()")); } private void transfer() { System.out.println(String.format("%s.%s called!", this.getClass().getName(), "transfer()")); }}
测试类代码:
public class WorkClass { public void test() { HouseProxy houseProxy =new HouseProxy(); houseProxy.purchase(); }}
输出结果:
I/System.out: com.example.qinghua_liu.myapplication.designpatten.struct.adapt.HouseProxy.search() called!
I/System.out: com.example.qinghua_liu.myapplication.designpatten.struct.adapt.HouseBuyer.purchase() called!
I/System.out: com.example.qinghua_liu.myapplication.designpatten.struct.adapt.HouseProxy.transfer() called!
房屋代理中介在购买者购买房屋之前帮忙做了房源搜索,之后做了房产产权迁移等服务行为。
- 装饰者模式(Decorator)与代理模式(Proxy)的区别
我们使用上述不论哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法,但装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏原始对象的具体信息(这就像房产中介不想让房东与购买者直接联系,为了防止跳单)。因此,当使用代理模式的时候,我们常常在一个代理类中自己创建一个原始类的实例。并且,当我们使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
- Java编程开发设计模式之--装饰者模式(Decorator)与代理模式(Proxy)
- 我的设计模式-装饰(Decorator)、代理(Proxy)
- 设计模式(5)-代理(Proxy)模式和装饰(Decorator)模式
- 装饰模式(Decorator)和代理模式(Proxy)
- 【设计模式】之装饰模式(Decorator)
- 设计模式之装饰模式(Decorator)
- 设计模式之 装饰模式(Decorator)
- 设计模式之装饰模式(Decorator)
- 设计模式之装饰(Decorator)模式
- 设计模式之装饰模式(Decorator)
- 设计模式之装饰模式(Decorator)
- 设计模式之Decorator(装饰者)
- Java设计模式---装饰模式(Decorator)
- 装饰模式(Decorator)与代理模式(Proxy)的区别与联系
- java.io.*中的设计模式之 装饰(Decorator)模式
- 设计模式-装饰者模式(Decorator)
- Java与模式之装饰(Decorator)模式
- java设计模式之装饰模式Decorator
- 树形下拉列表
- 密码锁,开机锁
- linearlayout实现fragment切换
- 基于注解的SpringMVC简单介绍
- 单例设计模式(Singleton Pattern)完全解析
- Java编程开发设计模式之--装饰者模式(Decorator)与代理模式(Proxy)
- 自定义Dialog出现黑色背景,去除策略
- 任务栏图标和右键菜单
- Clang Attributes 苹果iOS 未尝试过代码
- JS自定义Title文字提示
- 产品经理之定价框架和策略
- oracle调用JAVA类的方法 (第二种方法测试不行)
- java Collection
- 设置button的边框和颜色