设计模式:策略、代理、单例

一. 策略模式

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

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

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

时间: 2024-10-11 05:13:38

设计模式:策略、代理、单例的相关文章

Java设计模式中的单例设计

/** * 单例设计模式 * 应用场合:只需要一个对象的 * 作用:保证整个应用程序中某个实例有且只有一个 * 类型有:饿汉模式.懒汉模式 * 下面的例子是一个饿汉模式的例子 */ class SingleDemo { // 1.将构造方法私有化,不允许外部直接创建使用 private SingleDemo() {} // 2.创建类的唯一实例,使用private static修饰 private static SingleDemo instance = new SingleDemo(); //

设计模式整理_单例设计模式

单例设计模式,它确保一个类只有一个实例,并提供一个全局访问点. 由于单例设计模式对应的类只能创建一个对象,因此它所对应的方法必须是static(不是static只有创建对象才能调用). 以下是单例模式的一个经典实现:采用了延迟加载对象的例子. public class Single1 { private static Single1 single; //利用一个静态变量来记录Single1的唯一实例,这里没有直接声明,采用了延迟加载模式. private Single1(){} //把构造器声明

页面之间传值方式的总结,五种方式,通知,block,代理,单例,NSUERDEFALUT,

首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @property (nonatomic, strong) NSString *myName;//单例的属性,用于传值 +(DataSource*)sharedDataSource;//建立单例对象 @end .m文件 #import "DataSource.h" @implementati

iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)

关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. 首先得搞清楚设计模式是个什么鬼,在软件设计领域,设计模式是对通用问题的可复用的解决方案.设计模式是一系列帮你写出更可理解和复用代码的模板,设计模式帮你创建松耦合的代码以便你不需要费多大力就可以改变或者替换代码中的组件 其实iOS中的设计模式有非常多,常用的就下面这四种 一.MVC设计模式(设计模式

设计模式(一)__单例设计模式

先来介绍一下什么是设计模式,设计模式起先是从建筑行业借鉴来的,然后慢慢发展到了今天这个样子. 设计模式是解决问题最行之有效的思想,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. java有23种设计模式,今天就先来介绍一种:单例设计模式 单例设计模式: 有时候当你需要保证一个类在内存中的对象唯一性的时候,比如多程序读取一个配置文件时,建议配置文件封装成对象.会方便操作其中数据,又要保证多个程序读到的是同一

"围观"设计模式(29)--创建型设计模式总结(单例、工厂、原型、创建者)

设计模式源码下载地址 设计模式源码下载地址 1  单例模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息.这种方式简化了在复杂环境下的配置管理.----维基百科(WIKIPEDIA) 个人的理解: 单例模式概

设计模式之:单例设计模式

单例设计模式 单例设计模式概述 单例模式就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供. 优点 在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能. 缺点 没有抽象层,因此扩展很难. 职责过重,在一定程序上违背了单一职责 单例模式: 饿汉式:类一加载就创建对象 懒汉式:用的时候,才去创建对象 例子1:单例设计模式之饿汉式 public classStudent { // 构造私有 private Student()

[java]设计模式之singleton(单例)

在日常工作中,有很多对象,我们只需要一个.比如:线程池, 缓存,注册表等.如果制造出多个实例,就会导致许多问题,如程序行为异常,资源使用过量等.这就需要对对象的构建进行控制,使其只能产生一个对象.这就是本篇要讲的设计模式--singleton(单例). 单例模式的定义:确保只有一个类只有一个实例,并提供一个全局访问点. 那么,要如何实现单例模式,使得一个类只能产生一个对象呢?请看下面的实现: public class Singleton { private static Singleton s;

【java设计模式】之 单例(Singleton)模式

1. 单例模式的定义 单例模式(Singleton Pattern)是一个比较简单的模式,其原始定义如下:Ensure a class has only one instance, and provide a global point of access to it. 即确保只有一个实例,而且自行实例化并向整个系统提供这个实例.单例模式的通用类如下图所示: Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的(在Singleton中

设计模式学习笔记——单例设计模式

1.特点:只需一个实例时考虑. 2.概念:保证一个类仅有一个实例,并提供一个供访问的全局点. 3.类图: 4程序实现: 1)懒汉式:对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备.它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回.懒汉模式只在外部对象第一次请求实例的时候才去创建.懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快.它在整个应用的生命周期只有一部分时