ProxyPattern(23种设计模式之一)
设计模式六大原则(1):单一职责原则
设计模式六大原则(2):里氏替换原则
设计模式六大原则(3):依赖倒置原则
设计模式六大原则(4):接口隔离原则
设计模式六大原则(5):迪米特法则
设计模式六大原则(6):开闭原则
参考书籍:设计模式-可复用面向对象软件基础(黑皮书)
代理模式,在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用,其特征是代理类与委托类有同样的接口
简单的典型实例:上网行为中的代理模式
ProxyPattern,UML抽象图百度找,代码实现如下
使用代理模式设计上网行为
代理与实体公共接口
package ProxyPattern;
public interface NetWork {
public abstract void browser();
}
实体类
package ProxyPattern.RealSubject;
import ProxyPattern.NetWork;
public class Real implements NetWork {
public void browser() {
System.out.println("上网浏览信息");
}
}
代理类
package ProxyPattern.Proxy;
import ProxyPattern.NetWork;
public class Proxy implements NetWork{
private NetWork netWork;
public Proxy(NetWork netWork){
this.netWork = netWork;
}
public void browser() {
checkName();
this.netWork.browser();
}
private void checkName(){
//业务逻辑
}
}
测试类
package ProxyPattern;
import ProxyPattern.Proxy.Proxy;
import ProxyPattern.RealSubject.Real;
public class Test {
public static void main(String[] args) {
new Proxy(new Real()).browser();
}
}
待续
关于日志代理
代理与被代理接口
package ProxyPattern;
interface AbstractLog {
public void method();
}
被代理类
package ProxyPattern;
import java.text.SimpleDateFormat;
import java.util.Random;
public class LogRecord implements AbstractLog{
@Override
public void method() {
try{
java.util.Date date = new java.util.Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = format.format(date);
System.out.println("方法method被调用,调用时间为:" + time);
//除零失败异常测试
Random random = new Random();
int a = random.nextInt(10);
int b = random.nextInt(2);
int c = a/b;
System.out.println("方法method调用成功");
System.out.println("除零失败测试数据为:" + c);
}catch(Exception e){
System.out.println("方法method调用失败");
}
}
}
代理类
package ProxyPattern;
public class LogProxy implements AbstractLog {
/*
* 远程代理可以隐藏一个对象存在于不同地址空间的事实
* 虚代理可以进行最优化,例如根据要求创建对象
* 保护代理和智能指针都允许访问一个对象时有一些附加的内务处理
* */
private LogRecord lp;
public LogProxy(){
lp = new LogRecord();
}
@Override
public void method() {
//代理方法实现
//使用代理模式的动机:用户希望程序和某个对象打交道,程序不希望用户直接访问该对象
lp.method();
}
}
测试类
package ProxyPattern;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
AbstractLog al = new LogProxy();
al.method();
}
}
待续
ProxyPattern(23种设计模式之一)的更多相关文章
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- Java开发中的23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java开发中的23种设计模式(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- c#中的23种设计模式
C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核 ...
- Java 23种设计模式
转自: http://zz563143188.iteye.com/blog/1847029 ; i<count; i++){ list.add(new MailSender()); } } pu ...
- 从追MM谈Java的23种设计模式(转)
从追MM谈Java的23种设计模式 这个是从某个文章转载过来的.但是忘了原文链接.如果知道的,我追加一下. 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西 ...
- java 23种设计模式及具体例子 收藏有时间慢慢看
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...
- JAVA:23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 从追MM谈Java的23种设计模式
从追MM谈Java的23种设计模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯 德基,只管向服务员说“来四个鸡 ...
- 23种设计模式全解析 (java版本)
转自:http://blog.csdn.net/longyulu/article/details/9159589 其中PHP常用的五种设计模式分别为:工厂模式,单例模式,观察者模式,策略模式,命令模式 ...
随机推荐
- PES包格式
PES是Packetized Elementary Stream的简称,是将原始ES流打包后形成的,再将PES经过不同的打包方式可以组成MPEG program stream 和 MPEG trans ...
- Liveqrcode活码系统设计
活码是一种二维码,可以通过后台配置让用户扫码时跳转到不同的网址.除了二维码生成接口,本站还实现了多租户的活码配置接口,以及活码后台jar包,详见二维码接口. 二维码生成使用了zxing三方包实现,活码 ...
- 561. 数组拆分 I
题目 python class Solution: def arrayPairSum(self, nums): """ :type nums: List[int] :rt ...
- Excel if函数无法正确对比大小
我想完成以下操作 1.提取A列数字的第7-11位的数字 2.若此数字大于1993 3.则返回20,不然返回0 于是我在B和C列上写了两个函数,分别是 MID(A1,7,4) IF(B ...
- Eclipse环境配置
7.打开Eclipse的偏好设置,我们需要对Eclipse做一下配置: 8.从左侧栏选择java下面的Installed JREs,然后点击Add按钮,我们要为Eclipse配置JDK: 9.选择“S ...
- mysql命令之二:查看mysql版本的四种方法
1:在终端下:mysql -V. 以下是代码片段: [shengting@login ~]$ mysql -V mysql Ver 14.7 Distrib 4.1.10a, for redhat-l ...
- POJ 2674 Linear world(弹性碰撞)
Linear world Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 4426 Accepted: 1006 Desc ...
- MySQL升级指南
一 .MySQL升级 1.官方升级策略 注意 升级过程中必须使用具有管理权限的MySQL帐户来执行SQL语句. 1.升级方法 逻辑升级: 涉及使用 mysqldump从旧的MySQL版本导出现有数据 ...
- 安装OpenResty
./configure --prefix=/data/openresty_10002 --with-luajit --with-http_stub_status_module OpenResty,也被 ...
- FastJSON 转换List<T> ,Map<T,T>泛型失败 处理方法
dictDataMap = JSON.parseObject(dictAllCacheResult,new TypeReference<Map<String, DictionaryData ...