zoukankan      html  css  js  c++  java
  • 设计模式:策略、代理、单例

    一. 策略模式

    定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

    先说这个场景中的要素:三个妙计,一个锦囊,一个赵云。

    1)妙计:(一个接口,三个具体妙计)

    1 package com.henry.strategy;
    2 
    3 public interface IStrategy {
    4     
    5     public void operate();
    6     
    7 }
    IStrategy.java
     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 }
    BackDoor.java
     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 }
    GivenGreenLight.java
     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 }
    BlockEnemy.java

    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 }
    Context.java

    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 }
    ZhaoYun.java

    二. 代理模式
    定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    场景:比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的:
    1) 先定义一种类型的女人:

    1 package com.henry.proxy;
    2 
    3 public interface KindWomen {
    4     
    5     public void makeEyesWithMan();
    6     public void happyWithMan();
    7     
    8 }
    KindWomen.java

    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     @Override
    16     public void makeEyesWithMan() {
    17         // TODO Auto-generated method stub
    18         this.kindWomen.makeEyesWithMan();
    19     }
    20 
    21     @Override
    22     public void happyWithMan() {
    23         // TODO Auto-generated method stub
    24         this.kindWomen.happyWithMan();
    25     }
    26 
    27 }
    WangPo.java

    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 }
    XiMenQing.java

      那这就是活生生的一个例子,通过代理人实现了某种目的,如果真去掉王婆这个中间环节,直接是西
    门庆和潘金莲勾搭,估计很难成就武松杀嫂事件。

      那我们再考虑一下,水浒里还有没有这类型的女人?有,卢俊义的老婆贾氏(就是和那个固管家苟合
    的那个),这名字起的:“假使”,那我们也让王婆做她的代理:

    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     @Override
    12     public void happyWithMan() {
    13         // TODO Auto-generated method stub
    14         System.out.println("贾氏正在happy中......");
    15     }
    16 
    17 }
    JiaShi

    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 }
    XiMenQing2.java
    (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 }
    Emperor.java
     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 day
    10         Emperor emperor2 = Emperor.getInstance();
    11         emperor2.emperorInfo();
    12         
    13         //Third day
    14         Emperor emperor3 = Emperor.getInstance();
    15         emperor3.emperorInfo();
    16     }
    17 }
    Minister.java
  • 相关阅读:
    JS检测浏览器Adobe Reader插件
    Java Filter防止sql注入攻击
    log4j的基本配置参数
    Log4j.properties配置详解
    使用Spring进行统一日志管理 + 统一异常管理
    springMVC获取request和response
    深入浅出Mybatis-分页
    PROPAGATION_REQUIRED事务管理
    Java String类型数据的字节长度
    构建高并发高可用的电商平台架构实践
  • 原文地址:https://www.cnblogs.com/fanszone/p/4024644.html
Copyright © 2011-2022 走看看