设计模式—静态代理模式(聚合与继承方式比较)

一、概述

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

1 public interface Movable {
2     public void move();
3 }

2.Tank.java

 1 import java.util.Random;
 2
 3 public class Tank implements Movable {
 4
 5     @Override
 6     public void move() {
 7         System.out.println("Tank moving.......");
 8         try {
 9             Thread.sleep(new Random().nextInt(5000));
10         } catch (InterruptedException e) {
11             e.printStackTrace();
12         }
13     }
14
15 }

3.TankTimeProxy.java

 1 public class TankTimeProxy implements Movable {
 2
 3     Movable m;
 4
 5     public TankTimeProxy(Movable m) {
 6         this.m = m;
 7     }
 8
 9     @Override
10     public void move() {
11         System.out.println("Time Proxy start...........");
12         long start = System.currentTimeMillis();
13         m.move();
14         long end = System.currentTimeMillis();
15         System.out.println("花费时间:"+(end - start));
16         System.out.println("Time Proxy end...........");
17     }
18
19 }

4.TankLogProxy.java

 1 public class TankLogProxy implements Movable {
 2
 3     Movable m;
 4
 5     public TankLogProxy(Movable m) {
 6         this.m = m;
 7     }
 8
 9     @Override
10     public void move() {
11         System.out.println("Log Proxy start...........");
12         m.move();
13         System.out.println("Log Proxy end...........");
14     }
15
16 }

5.Tank2Time.java

 1 public class Tank2Time extends Tank {
 2
 3     public void move(){
 4         System.out.println("Tank2 time  start...........");
 5         long start = System.currentTimeMillis();
 6         super.move();
 7         long end = System.currentTimeMillis();
 8         System.out.println("花费时间:"+(end - start));
 9         System.out.println("Tank2 time end...........");
10     }
11 }

6.Tank3Log.java

1 public class Tank3Log extends Tank2Time {
2
3     public void move(){
4         System.out.println("Tank3Log  start...........");
5         super.move();
6         System.out.println("Tank3Log  end...........");
7     }
8 }

7.Client.java

 1 public class Client {
 2
 3     @Test
 4     public void testProxy(){
 5
 6         Tank t = new Tank();
 7         Movable m;
 8
 9         //一、聚合的方式(较灵活,因为实现了接口)
10         //1.1聚合方式的代理,先日志代理,后时间代理
11         TankTimeProxy ttp1 = new TankTimeProxy(t);
12         TankLogProxy tlp1 = new TankLogProxy(ttp1);
13
14         m = tlp1;
15         m.move();
16
17         System.out.println("\n==============================分隔线==========================\n");
18
19         //1.2聚合方式的代理,先时间代理,后日志代理(可以灵活切换顺序)
20         TankLogProxy tlp2 = new TankLogProxy(t);
21         TankTimeProxy ttp2 = new TankTimeProxy(tlp2);
22
23         m = ttp2;
24         m.move();
25
26         System.out.println("\n==============================分隔线==========================\n");
27
28         //二、继承的方式
29         //2.1代理时间
30         Tank2Time t2 = new Tank2Time();
31         t2.move();
32
33         System.out.println("\n==============================分隔线==========================\n");
34
35         //2.2先代理日志,后时间,不能灵活切换
36         Tank3Log t3 = new Tank3Log();
37         t3.move();
41     }
42 }

三、运行结果

因为每个代理都实现了同一movable接口,代理和被代理对象之间都可以相互灵活转换,以实现代理功能之间的灵活叠加组合。

时间: 2024-08-13 13:03:44

设计模式—静态代理模式(聚合与继承方式比较)的相关文章

[设计模式]静态代理模式

Subject.java 1 package cn.itcast.proxy; 2 3 //定义一个抽象类,代理角色和真实角色都要实现这个共同的抽象类 4 public abstract class Subject { 5 //定义一个方法,这个方法就好比中介和房东都有向外租房子的方法 6 public abstract void request(); 7 } RealSubject.java 1 package cn.itcast.proxy; 2 3 //这个类好比是真正的房东.实现向外租房

设计模式三: 代理模式(Proxy) -- JDK的实现方式

设计模式三: 代理模式(Proxy) -- JDK的实现方式 简介 代理模式属于行为型模式的一种, 控制对其他对象的访问, 起到中介作用. 代理模式核心角色: 真实角色,代理角色; 按实现方式不同分为静态代理和动态代理两种; 意图 控制对其它对象的访问. 类图 实现 JDK自带了Proxy的实现, 下面我们先使用JDK的API来演示代理如何使用, 随后再探究Proxy的实现原理,并自己来实现Proxy. JDK代理类的使用: (InvocationHandler,Proxy) 使用JDK实现的代

GOF23设计模式之静态代理模式实现之经典

 /**  * 抽象就角色,定义代理角色和真实角色的公共对外方法  * 时间:2015年4月4日18:45:00  * 在这个例子中,抽象角色起着规范代理角色和真实角色的作用.  * 其中具有方法,面谈,签合同收预付款,预订机票,唱歌,收尾款  */ package com.bjsxt.cn.proxy.staticProxy; public interface Star {  void confer();  void signContract();  void bookTicket();

设计模式一静态代理模式

静态代理模式 间接地访问该对象,从而限制.增强或修改该对象的一些特性.       代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 静态代理 是由程序员创建或特定工具自动生成源代码,在对其编译. 在程序员运行之前,代理类.class文件就已经被创建了. 动态代理 是在程序运行时通过反射机制动态创建的. 静态代理总结: 优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展. 缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理. 同时接口一旦发生改变,代理类也

设计模式之代理模式(Proxy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

JAVA设计模式之代理模式

学编程吧JAVA设计模式之代理模式发布了,欢迎通过xuebiancheng8.com来访问 一.概述 给某一个对象提供一个代理,并由代理对象来完成对原对象的访问.代理模式是一种对象结构型模式. 二.适用场景 当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口. 三.UML类图 四.参与者 1.接口类:Subject 它声明了真实访问者和代理访问者的共同接口,客户端通常需要针对接口角色进行编程. 2.代理类

JAVA笔记7__接口应用/Object类/简单工厂模式/静态代理模式/适配器模式

/** * 接口应用 */ public class Main { public static void main(String[] args) { Person p = new Person("fish7"); p.setIsay(new BeforeGong()); p.say(); p.setIsay(new AfterGong()); p.say(); } } class Person{ //只有在运行期才和say行为关联起来,这就叫面向接口编程 private String

设计模式之代理模式20170724

结构型设计模式之代理模式: 一.含义 代理模式也叫做委托模式,其定义如下: 为其他对象提供一种代理以控制对这个对象的访问. 二.代码说明 1.主要有两个角色 1)具体主题角色 也叫做委托角色.被代理角色.它是业务逻辑的具体执行者. 2)代理主题角色 也叫做委托类.代理类.它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作. 一个代理类可以代理多个被委托者或被代理者. 2.在用C实现过程中也是参考这种思想,以游戏代理场

java设计模式6——代理模式

java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代理 动态代理 1.3.代理模式关系图(以租房子为例) 2.静态代理 2.1.角色分析: 抽象角色:一般会使用接口或者抽象类来解决 真实角色:被代理的角色 代理客户:代理真实角色.代理真实角色后,我们一般会做一些附属的操作 客户:访问代理对象的人 2.2.例1(租房子演示) 2.2.1.抽象角色实现(