- 代理模式最有魅力的地方就在于它实现了AOP(Aspect-Oriented Programming),即面向切面的编程
- 1.代理模式就像是火车站代售点,
- 2.业务应用,
公司有一个用户信息检索系统,管理员可以检索用户的基本信息,教育背景,和账户信息。由于业务发展的需要,此系统要跟公司实现信息共享,需要向别的公司提供我们的接口,但是信息共享并不是全部共享,只允许别的公司查询基本信息和教育背景,而有些敏感信息账户信息不允许别的公司调用的,在这里可以设置一个代理,用于控制访问查询信息接口的权限控制,当是外部想要查询账户信息时,给你返回 "********"掩码展示。
定义一个UserInfoService接口,有getBasicInfo(),getEducationalBackground(),getAcccountInfo()分别用于查询基本信息,教育背景,账户信息;
UserInfoServiceImpl类实现UserInfoService接口;
UserInfoServiceProxy类作为代理类,实现UserInfoService接口和持有一个UserInfoServiceImpl引用:
- package com.foo.proxy;
- /**
- * 售票服务接口
- * @author louluan
- */
- public interface TicketService {
- //售票
- public void sellTicket();
- //问询
- public void inquire();
- //退票
- public void withdraw();
- }
- package com.foo.proxy;
- /**
- * 售票服务接口实现类,车站
- * @author louluan
- */
- public class Station implements TicketService {
- @Override
- public void sellTicket() {
- System.out.println("\n\t售票.....\n");
- }
- @Override
- public void inquire() {
- System.out.println("\n\t问询。。。。\n");
- }
- @Override
- public void withdraw() {
- System.out.println("\n\t退票......\n");
- }
- }
- package com.foo.proxy;
- /**
- * 车票代售点
- * @author louluan
- *
- */
- public class StationProxy implements TicketService {
- private Station station;
- public StationProxy(Station station){
- this.station = station;
- }
- @Override
- public void sellTicket() {
- // 1.做真正业务前,提示信息
- this.showAlertInfo("××××您正在使用车票代售点进行购票,每张票将会收取5元手续费!××××");
- // 2.调用真实业务逻辑
- station.sellTicket();
- // 3.后处理
- this.takeHandlingFee();
- this.showAlertInfo("××××欢迎您的光临,再见!××××");
- }
- @Override
- public void inquire() {
- // 1做真正业务前,提示信息
- this.showAlertInfo("××××欢迎光临本代售点,问询服务不会收取任何费用,本问询信息仅供参考,具体信息以车站真实数据为准!××××");
- // 2.调用真实逻辑
- station.inquire();
- // 3。后处理
- this.showAlertInfo("××××欢迎您的光临,再见!××××");
- }
- @Override
- public void withdraw() {
- // 1。真正业务前处理
- this.showAlertInfo("××××欢迎光临本代售点,退票除了扣除票额的20%外,本代理处额外加收2元手续费!××××");
- // 2.调用真正业务逻辑
- station.withdraw();
- // 3.后处理
- this.takeHandlingFee();
- }
- /*
- * 展示额外信息
- */
- private void showAlertInfo(String info) {
- System.out.println(info);
- }
- /*
- * 收取手续费
- */
- private void takeHandlingFee() {
- System.out.println("收取手续费,打印发票。。。。。");
- }
- }
- package com.foo.proxy;
- /**
- * 客户端角色
- * @author louluan
- */
- public class Client {
- public static void main(String[] args) {
- //创建Station
- Station service = new Station();
- //创建代理类
- StationProxy proxy = new StationProxy(service);
- //代售点售票
- proxy.sellTicket();
- }
- }
- package com.foo.proxy1;
- /**
- * 信息查询接口
- */
- public interface UserInfoService {
- //基本信息
- public String getBasicInfo();
- //教育背景
- public String getEducationalBackground();
- //账户信息
- public String getAcccountInfo();
- }
- package com.foo.proxy1;
- /**
- * 查询接口实现
- * @author louluan
- */
- public class UserInfoServiceImpl implements UserInfoService {
- @Override
- public String getBasicInfo() {
- return "Basic Info....";
- }
- @Override
- public String getEducationalBackground() {
- return "Educational Background.....";
- }
- @Override
- public String getAcccountInfo() {
- return "Account Info.....";
- }
- }
- package com.foo.proxy1;
- /**
- * 信息查询代理控制访问权限
- * @author louluan
- */
- public class UserInfoServiceProxy implements UserInfoService {
- private UserInfoService impl;
- private String role;
- public UserInfoServiceProxy(UserInfoService impl,String role)
- {
- this.impl = impl;
- this.role = role;
- }
- @Override
- public String getBasicInfo() {
- return impl.getBasicInfo();
- }
- @Override
- public String getEducationalBackground() {
- return impl.getEducationalBackground();
- }
- @Override
- public String getAcccountInfo() {
- //如果是公司本部,返回
- if("1".equals(role))
- {
- return impl.getAcccountInfo();
- }
- //禁止访问impl方法,返回****
- return "**********";
- }
- }
- package com.foo.proxy1;
- public class Client {
- public static String OUT="0";
- public static String IN="0";
- public static void main(String[] args) {
- UserInfoService service = new UserInfoServiceImpl();
- UserInfoServiceProxy proxy = new UserInfoServiceProxy(service,OUT);
- //外部公司查询信息
- System.out.println("*****外部公司查询信息*******");
- //获取基本信息:
- String basicInfo = proxy.getBasicInfo();
- System.out.println("基本信息:"+basicInfo);
- //教育背景
- String educationalBackground = proxy.getEducationalBackground();
- System.out.println("教育背景:"+educationalBackground);
- //账户信息
- String accountInfo = proxy.getAcccountInfo();
- System.out.println("账户信息:"+accountInfo);
- }
- }
