博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java之 代理设计模式
阅读量:5038 次
发布时间:2019-06-12

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

1. 设计一个案例来实现租房功能。分析:在租房的过程中涉及到了3个对象,房东,中介,房客。

中介和房客具有相同的功能--租房。

可以设计如下:

2.上图的设计实际上就是一个代理设计模式---静态代理设计模式。

代理设计模式有4个角色

抽象角色 : 是一个接口,使得真实角色和代理角色具有相同的功能。

真实角色: 实际存在某个功能或权限的角色。

代理角色:代理真实角色实现某种功能。代理角色可以附加另外一些功能。

客户端:使用代理角色。

3.使用代码实现

Rent.java

public interface Rent {    //租房    public void rent();}

Host.java

public class Host implements Rent{    @Override    public void rent() {        System.out.println("========将房屋出租=======");    }}

Proxy.java

public class Proxy implements Rent{    private Host host;        public Proxy(Host host) {        super();        this.host = host;    }    @Override    public void rent() {        fare();        host.rent();        maintance();    }    private void fare(){        System.out.println("-----收取中介费---");    }    private void maintance(){        System.out.println("-----房屋维护---");    }    public void setHost(Host host) {        this.host = host;    }}

Client.java

public class Client {    public static void main(String[] args) {        Host host = new Host();        Proxy proxy = new Proxy(host);        proxy.rent();    }}

4.作用

真实角色代码在不增加的情况下,增加了新的功能。

5.应用案例

UserService.java

public interface UserService {    public void add();    public void delete();    public void update();}

UserServiceImpl.java

/** * 在service的方法中,经常会有一些公共的功能, * 如:事务,日志,权限,缓存等 * */public class UserServiceImpl implements UserService{    @Override    public void add() {        System.out.println("add");    }    @Override    public void delete() {        System.out.println("delete");    }    @Override    public void update() {        System.out.println("update");    }}

UserServiceImplProxy.java

public class UserServiceImplProxy implements UserService{    private UserService userService;    @Override    public void add() {        LogUtil.log();        userService.add();    }    @Override    public void delete() {        LogUtil.log();        userService.delete();    }    @Override    public void update() {        LogUtil.log();        userService.update();    }    }

LogUtil.java

public class LogUtil {    public static void log(){        System.out.println("进入了方法");    }}

 

6.总结

通过以上代码可知,

优点:静态代理实现了公共业务和真实的业务逻辑的分离,降低了耦合,结构更清晰,维护更方便,扩展更容易,分工更明确。

缺点:代码的复杂程度增加,每个业务类都需要有一个相关的代理类,代码量增加-------解决办法:使用动态代理。

 

转载于:https://www.cnblogs.com/Vincent-yuan/p/11260911.html

你可能感兴趣的文章
PHP 微信错误状态返回码说明
查看>>
【4.1】Python中的序列分类
查看>>
ubuntu 移动文件
查看>>
Easy Mock
查看>>
看看 Delphi XE2 为 VCL 提供的 14 种样式
查看>>
Python内置函数(29)——help
查看>>
机器学习系列-tensorflow-01-急切执行API
查看>>
SqlServer 遍历修改字段长度
查看>>
Eclipse快捷键:同时显示两个一模一样的代码窗口
查看>>
《架构之美》阅读笔记05
查看>>
《大道至简》读后感——论沟通的重要性
查看>>
JDBC基础篇(MYSQL)——使用statement执行DQL语句(select)
查看>>
关于React中props与state的一知半解
查看>>
java中Hashtable和HashMap的区别(转)
查看>>
关闭数据库
查看>>
webStrom智能提示忽略首字母大小写问题
查看>>
层叠加的五条叠加法则(一)
查看>>
设计模式六大原则(5):迪米特法则
查看>>
对Feature的操作插入添加删除
查看>>
javascript String
查看>>