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常用的五种设计模式分别为:工厂模式,单例模式,观察者模式,策略模式,命令模式 ...
随机推荐
- HL7 Tools suite
HL7的官网有很多开源工具, 比如:RoseTree,V3Generator,RMIM Designer, Design Repository, V2 & V3 Mapping Tools等. ...
- Unit07: MyBatis框架简介 、 MyBatis基本应用
Unit07: MyBatis框架简介 . MyBatis基本应用 1. myBatis (1)myBatis是什么? 是一个开源的持久层框架. 注:myBatis底层仍然是jdbc. (2)编程步骤 ...
- Asp.net中的web.config配置文件(转)
最近开始学习.NET的开发,首先碰到的就是web.config的配置问题,把网上大虾的资料转发记录一下,以备不时之需. 原贴路径如下:http://blog.csdn.net/hbqhdlc/arti ...
- 【转】JMeter技巧集锦
JMeter是一个流行的用于负载测试的开源工具,具有许多有用的功能元件,如线程组(threadgroup),定时器(timer),和HTTP取样(sampler)元件.本文是对JMeter用户手册的补 ...
- 一个for循环写出9*9乘法表
public class ClassTest03 { public static void main(String[] args) { for(int i=1,j=1;j<=9;j++){ if ...
- [转]SQLite 经验集
SQLite 的默认时间 转自:http://www.cnblogs.com/pennant/archive/2011/08/11/2134897.html select strftime('%Y-% ...
- 《Hadoop技术内幕》读书笔记——Task运行过程分析
本文是董西成的Hadoop技术内幕一书的读书章节总结. 第八章 Task运行过程分析 所有Task需要周期性地向TaskTracker汇报最新进度和计数器值,而这正是由Reporter组件实现的,其中 ...
- 029:高可用之MHA
高可用之MHA 一.MHA 简介 MHA(Master High Availability)是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能 ...
- python学习笔记(十三): 多线程多进程
一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...
- Node.js的适用场景
高并发.聊天.实时消息推送.服务器做前端资源压缩