Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较
一、概述
1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换
2.思路:
(1)聚合:代理类聚合了被代理类,且代理类及被代理类都实现了movable接口,则可实现灵活多变,具体看代码
(2)继承:继承不够灵活,具体看代码
二、代码
1.Movable.java
2.Tank.java
3.TankTimeProxy.java
4.TankLogProxy.java
5.Tank2Time.java
6.Tank3Log.java
7.Client.java
1.Movable.java
public interface Movable {
public void move();
}
2.Tank.java
import java.util.Random;
public class Tank implements Movable {
@Override
public void move() {
System.out.println("Tank moving.......");
try {
Thread.sleep(new Random().nextInt(5000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3.TankTimeProxy.java
public class TankTimeProxy implements Movable {
Movable m;
public TankTimeProxy(Movable m) {
this.m = m;
}
@Override
public void move() {
System.out.println("Time Proxy start...........");
long start = System.currentTimeMillis();
m.move();
long end = System.currentTimeMillis();
System.out.println("花费时间:"+(end - start));
System.out.println("Time Proxy end...........");
}
}
4.TankLogProxy.java
public class TankLogProxy implements Movable {
Movable m;
public TankLogProxy(Movable m) {
this.m = m;
}
@Override
public void move() {
System.out.println("Log Proxy start...........");
m.move();
System.out.println("Log Proxy end...........");
}
}
5.Tank2Time.java
public class Tank2Time extends Tank {
public void move(){
System.out.println("Tank2 time start...........");
long start = System.currentTimeMillis();
super.move();
long end = System.currentTimeMillis();
System.out.println("花费时间:"+(end - start));
System.out.println("Tank2 time end...........");
}
}
6.Tank3Log.java
public class Tank3Log extends Tank2Time {
public void move(){
System.out.println("Tank3Log start...........");
super.move();
System.out.println("Tank3Log end...........");
}
}
7.Client.java
public class Client {
@Test
public void testProxy(){
Tank t = new Tank();
Movable m;
//一、聚合的方式(较灵活,因为实现了接口)
//1.1聚合方式的代理,先日志代理,后时间代理
TankTimeProxy ttp1 = new TankTimeProxy(t);
TankLogProxy tlp1 = new TankLogProxy(ttp1);
m = tlp1;
m.move();
System.out.println("\n==============================分隔线==========================\n");
//1.2聚合方式的代理,先时间代理,后日志代理(可以灵活切换顺序)
TankLogProxy tlp2 = new TankLogProxy(t);
TankTimeProxy ttp2 = new TankTimeProxy(tlp2);
m = ttp2;
m.move();
System.out.println("\n==============================分隔线==========================\n");
//二、继承的方式
//2.1代理时间
Tank2Time t2 = new Tank2Time();
t2.move();
System.out.println("\n==============================分隔线==========================\n");
//2.2先代理日志,后时间,不能灵活切换
Tank3Log t3 = new Tank3Log();
t3.move();
}
}
三、运行结果

四、小结
凡是要求灵活多变的功能,多数用接口多态实现
Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较的更多相关文章
- Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()
一.概述 1.目标:不自己写代理类,利用Proxy.newProxyInstance()动态生成 2.用到的知识点: (1)//编译源码,生成class,注意编译环境要换成jdk才有compiler, ...
- Java-马士兵设计模式学习笔记-代理模式-动态代理 修改成可以任意修改代理逻辑
一.概述 1.目标:动态代理的代理逻辑可以任意修改 2.思路: (1)要把代理逻辑抽离,站在jvm的角度思考,应独立出InvocationHandler接口,并接收被代理的对象及方法作为参数invok ...
- Java-马士兵设计模式学习笔记-命令模式
一.概述 命令模式 二.代码 1.Client.java public class Client { public void request(Server server){ server.addCom ...
- Java-马士兵设计模式学习笔记-桥接模式
一.概述 1.桥接模式的应用情况:(1)两个维度扩展(2)排列组合 二.代码 1.Gift.java public class Gift { protected GiftImpl giftImpl; ...
- Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式
一.概述 1.抽象工厂:当情况是需要产生一系列产品,若需更换产品,则要求一系列产品一起换,且要控制一系列产品的产生过程,此时可考虑抽象工厂模式.例:小明装修屋子,把电视.冰箱都替换掉,他这次需要把电视 ...
- Java-马士兵设计模式学习笔记-工厂模式-简单工厂
一.概述 1.目标:要控制任意类型交通工具的生产模式 2.目标有两层意思(1)任意类型 (2)生产模式,所以对应的,要这两个层面上抽象(Movable,VehicleFactory),利用接口,实现多 ...
- Java-马士兵设计模式学习笔记-策略模式-模拟 Comparator接口
续上一篇 <Java 模拟 Comparable接口> 一.Teacher类及Student类的比较大小方式是不固定的,比如老师除了比较职称外,还可比较工龄大小,年龄大小等.则定义Com ...
- Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList
Java Iterator模式 Java Iterator模式, 模仿Collectin ArrayList LinckedList 一.有如下几个类 1.接口Collection.java 2.接口 ...
- Java-马士兵设计模式学习笔记-建造者模式
一.概述 二.代码 1.Animal.java public interface Animal { public void bark(); } 2.Dog.java public class Dog ...
随机推荐
- MVC Autofac 注入点
关键句: ** DependencyResolver.SetResolver(new AutofacDependencyResolver(container));** protected overri ...
- enum枚举类型的使用
修饰符为public static enum,不用加final,否则提示错误. 枚举类的所有实例必须在枚举类中显式列出(,分隔,; 结尾).列出的实例系统会自动添加 public static fin ...
- HDU5853 Jong Hyok and String(二分 + 后缀数组)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5853 Description Jong Hyok loves strings. One da ...
- 2014-2015 ACM-ICPC, NEERC, Moscow Subregional Contest E. Equal Digits
E. Equal Digits time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- iOS学习05C语言函数
本次主要是学习和理解函数,函数树状图如下: 1.函数的声明和定义 函数定义的四要素分别为: 返回值类型 :函数的结果值类型,函数不能返回数组. 指定返回类型是void类型说明函数没有返回值. 函数名 ...
- HDU5331 : Simple Problem
因为是二分图,所以最大独立集$=$总点数$-$最大匹配. 因为是树,所以具有贪心性质,设$f_i$表示$i$是否与其孩子匹配,$a_i$表示$i$的孩子里$f$为$0$的个数,则$f_i=[a_i&g ...
- storm 原理简介及单机版安装指南——详细版【转】
storm 原理简介及单机版安装指南 本文翻译自: https://github.com/nathanmarz/storm/wiki/Tutorial 原文链接自:http://www.open-op ...
- 【转】Android之自定义Adapter的ListView
http://www.cnblogs.com/topcoderliu/archive/2011/05/07/2039862.html 在开发中,我们经常使用到ListView这个控件.Android的 ...
- POJ 1279 Art Gallery(半平面交)
题目链接 回忆了一下,半平面交,整理了一下模版. #include <cstdio> #include <cstring> #include <string> #i ...
- GO语言练习:网络编程 ICMP 示例
1.代码 2.编译及运行 1.Go语言网络编程:ICMP示例代码 icmptest.go package main import ( "fmt" "net" & ...