博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰器模式与代理模式
阅读量:7057 次
发布时间:2019-06-28

本文共 3200 字,大约阅读时间需要 10 分钟。



装饰器模式start

  1. 有一个接口 ISomeService
package pattern.decorator;/** * @author futao * Created on 18-8-21-上午6:06. */public interface ISomeService {    String doSome(String parameter);}
  1. 有一个实现类(相当于原始代码--目标类) SomeService
package pattern.decorator;/** * @author futao * Created on 18-8-21-上午6:07. */public class SomeService implements ISomeService {    @Override    public String doSome(String parameter) {        return parameter;    }}
  1. 运行结果:
@Test  public void test18() {       ISomeService iSomeService = new SomeService();      String some = iSomeService.doSome("woqu hhh");      System.out.println(some);  }>>> woqu hhh
  1. 新需求:要把所有的输出变成大写,并且原来的类,业务逻辑SomeService不可改变
  2. 装饰器类:SomeServiceDecorator,对SomeService进行增强
package pattern.decorator;/** * @author futao * Created on 18-8-21-下午4:58. * 装饰器,增强SomeService * 1.继承同一个接口 * 2.在装饰器类中添加一个构造方法--在构造方法中添加需要增强的那个类的引用(装饰器类中要有目标对象作为成员变量,且目标对象是通过带参构造器传入的) */public class SomeServiceDecorator implements ISomeService {    ISomeService iSomeService;    @Override    public String doSome(String parameter) {        //先执行原有的业务逻辑        String some = iSomeService.doSome(parameter);        //对执行结果进行增强        return some.toUpperCase();    }    /**     * 要求一定要传入需要增强(装饰的那个类-对象)     *     * @param iSomeService     */    public SomeServiceDecorator(ISomeService iSomeService) {        super();        this.iSomeService = iSomeService;    }}
  1. 使用
@Test    public void test18() {        //目标对象        SomeService someService = new SomeService();        //装饰器        ISomeService iSomeService = new SomeServiceDecorator(someService);        //面向接口编程        String some = iSomeService.doSome("woqu hhh");        System.out.println(some);    }

7.高级用法:用一个基类去实现接口,在基类中执行目标类的业务逻辑。通过继承基类的方式增强目标类,每个子类可以实现各自的增强,将增强逻辑细分,每个子类增强一个小功能。

装饰器模式end



代理模式start

1.面向接口编程之业务接口: ISomeService

package pattern.proxy;/** * @author futao * Created on 18-8-21-下午6:58. */public interface ISomeService {    String doSome();    String doOther();}

2.业务逻辑类: SomeService

package pattern.proxy;/** * @author futao * Created on 18-8-21-下午7:01. * 业务逻辑 */public class SomeService implements ISomeService {    @Override    public String doSome() {        return "abcde";    }    @Override    public String doOther() {        return "今晚打老虎";    }}
  1. 代理类:SomeServiceProxy
package pattern.proxy;import com.alibaba.fastjson.JSONObject;/** * @author futao * Created on 18-8-21-下午6:58. * 代理类 */public class SomeServiceProxy implements ISomeService {    //代理对象---通过实例化new的方式直接创建    private ISomeService target = new SomeService();    @Override    public String doSome() {        return target.doSome();    }    /**     * 隐藏一些逻辑     *     * @return     */    @Override    public String doOther() {        //可以加上一些控制逻辑        JSONObject jsonObject = new JSONObject();        jsonObject.put("result", "无权限访问此资源.");        return JSONObject.toJSONString(jsonObject);    }}

4.使用:

@Test    public void test19(){        //不要实例化目标对象,没有暴露目标对象        pattern.proxy.ISomeService iSomeService=new SomeServiceProxy();        System.out.println(iSomeService.doSome());        System.out.println(iSomeService.doOther());    }>>>   abcde      {"result":"无权限访问此资源."}

5. 总结:

装饰器模式是为了增强目标对象
代理模式是为了保护隐藏目标对象

装饰器模式中的目标对象是通过带参构造器传入

代理模式是在代理类中直接创建

代理模式end



转载地址:http://pegol.baihongyu.com/

你可能感兴趣的文章
CentOS 7.0 配置varnish缓存
查看>>
table 去掉 td之间间距
查看>>
SQL Server 跨网段(跨机房)复制
查看>>
ESXI root密码忘记,重置root密码
查看>>
online游戏服务器架构--综述
查看>>
HTML DOM prompt() 方法
查看>>
职场英语修炼手册
查看>>
获取windows7 trustedInstaller权限
查看>>
WCF揭秘——共享数据契约
查看>>
C# 语音开发
查看>>
android118 上拉下拉刷新列表listView实现
查看>>
【转】高斯核函数
查看>>
WinDbg配置和使用基础
查看>>
scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据
查看>>
一种神经元探索系统方法及装置
查看>>
MySQL的IF函数
查看>>
深入解析Dropout——基本思想:以概率P舍弃部分神经元,其它神经元以概率q=1-p被保留,舍去的神经元的输出都被设置为零...
查看>>
android85 短信防火墙
查看>>
Python变量/运算符/函数/模块/string
查看>>
android144 360 快捷方式
查看>>