首页 > 代码库 > 设计模式:策略、代理、单例
设计模式:策略、代理、单例
一. 策略模式
定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云。
1)妙计:(一个接口,三个具体妙计)
1 package com.henry.strategy;2 3 public interface IStrategy {4 5 public void operate();6 7 }
1 package com.henry.strategy; 2 3 public class BackDoor implements IStrategy { 4 5 @Override 6 public void operate() { 7 // TODO Auto-generated method stub 8 System.out.println("找乔国老帮忙,让吴国太给孙权施加压力"); 9 }10 11 }
1 package com.henry.strategy; 2 3 public class GivenGreenLight implements IStrategy { 4 5 @Override 6 public void operate() { 7 // TODO Auto-generated method stub 8 System.out.println("求吴国太开个绿灯,放行!"); 9 }10 11 }
1 package com.henry.strategy; 2 3 public class BlockEnemy implements IStrategy { 4 5 @Override 6 public void operate() { 7 // TODO Auto-generated method stub 8 System.out.println("孙夫人断后,挡住追兵"); 9 }10 11 }
2)接下来就是锦囊了,用来放妙计的东东。
1 package com.henry.strategy; 2 3 public class Context { 4 5 private IStrategy strategy; 6 7 public Context(IStrategy strategy) { 8 this.strategy = strategy; 9 }10 11 public void operate() {12 this.strategy.operate();13 }14 }
3) 最后就是赵子龙登场的时候了。
1 package com.henry.strategy; 2 3 public class ZhaoYun { 4 5 public static void main(String[] args) { 6 Context context; 7 8 //刚刚到吴国的时候拆第一个 9 System.out.println("-----------刚刚到吴国的时候拆第一个-------------");10 context = new Context(new BackDoor()); //拿到妙计11 context.operate(); //拆开执行12 System.out.println("");13 14 //刘备乐不思蜀了,拆第二个了15 System.out.println("-----------刘备乐不思蜀了,拆第二个了-------------");16 context = new Context(new GivenGreenLight());17 context.operate(); //执行了第二个锦囊了18 System.out.println("");19 20 //孙权的小兵追了,咋办?拆第三个21 System.out.println("-----------孙权的小兵追了,咋办?拆第三个-------------");22 context = new Context(new BlockEnemy());23 context.operate(); //孙夫人退兵24 System.out.println("");25 }26 27 }
二. 代理模式
定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
场景:比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的:
1) 先定义一种类型的女人:
1 package com.henry.proxy;2 3 public interface KindWomen {4 5 public void makeEyesWithMan();6 public void happyWithMan();7 8 }
2) 再定一个丑陋的王婆:
1 package com.henry.proxy; 2 3 public class WangPo implements KindWomen { 4 5 private KindWomen kindWomen; 6 7 public WangPo() { 8 this.kindWomen = new PanJinLian(); 9 }10 11 public WangPo(KindWomen kindWomen) {12 this.kindWomen = kindWomen;13 }14 15 @Override16 public void makeEyesWithMan() {17 // TODO Auto-generated method stub18 this.kindWomen.makeEyesWithMan();19 }20 21 @Override22 public void happyWithMan() {23 // TODO Auto-generated method stub24 this.kindWomen.happyWithMan();25 }26 27 }
3) 两个女主角都上场了,男主角也该出现了:
1 package com.henry.proxy; 2 3 public class XiMenQing { 4 5 public static void main(String[] args) { 6 WangPo wangPo = new WangPo(); 7 8 wangPo.makeEyesWithMan(); 9 wangPo.happyWithMan();10 }11 12 }
那这就是活生生的一个例子,通过代理人实现了某种目的,如果真去掉王婆这个中间环节,直接是西
门庆和潘金莲勾搭,估计很难成就武松杀嫂事件。
那我们再考虑一下,水浒里还有没有这类型的女人?有,卢俊义的老婆贾氏(就是和那个固管家苟合
的那个),这名字起的:“假使”,那我们也让王婆做她的代理:
4)把贾氏素描出来:
1 package com.henry.proxy; 2 3 public class JiaShi implements KindWomen { 4 5 @Override 6 public void makeEyesWithMan() { 7 // TODO Auto-generated method stub 8 System.out.println("贾氏抛媚眼"); 9 }10 11 @Override12 public void happyWithMan() {13 // TODO Auto-generated method stub14 System.out.println("贾氏正在happy中......");15 }16 17 }
5) 西门庆勾贾氏:
1 package com.henry.proxy; 2 3 public class XiMenQing2 { 4 5 public static void main(String[] args) { 6 JiaShi jiaShi = new JiaShi(); 7 WangPo wangPo = new WangPo(jiaShi); 8 9 wangPo.makeEyesWithMan();10 wangPo.happyWithMan();11 }12 13 }
(1).职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
(3).高扩展性
三. 单例模式
1 package com.henry.singleton; 2 3 public class Emperor { 4 private static Emperor emperor = null; 5 6 private Emperor() { 7 } 8 9 public static Emperor getInstance() {10 if(emperor == null) {11 emperor = new Emperor();12 }13 return emperor;14 } 15 16 public static void emperorInfo(){17 System.out.println("我就是皇帝asdasdsdssd");18 }19 }
1 package com.henry.singleton; 2 3 public class Minister { 4 public static void main(String[] args) { 5 //First Day 6 Emperor emperor1 = Emperor.getInstance(); 7 emperor1.emperorInfo(); 8 9 //Second day10 Emperor emperor2 = Emperor.getInstance();11 emperor2.emperorInfo();12 13 //Third day14 Emperor emperor3 = Emperor.getInstance();15 emperor3.emperorInfo();16 }17 }
设计模式:策略、代理、单例
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。