篇一:Java3种模式带例子
中间件技术原理与应用
课程 Java设计模式
目录
1. 设计模式 ........................................................................................................................................ 2
1.1 创建型模式 .......................................................................................................................... 2
1.1.1 原型模式 ................................................................................................................... 2
1.2 结构型模式 .......................................................................................................................... 4
1.2.1 组合模式 ................................................................................................................... 5
1.3 行为型模式 .......................................................................................................................... 9
1.3.1 备忘录模式 ............................................................................................................. 11
1. 设计模式
1.1 创建型模式
AbstractFactory ( 抽象工厂 )
FactoryMethod ( 工厂方法 )
Singleton ( 单态模式 )
Builder ( 建造者模式 )
Protot*pe * 原型模式 )
1.1.1 原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 适用性
1.当一个系统应该独立于它的产品创*、构成和表示时。
2.当要实例化的类是在运行时刻指定时,例如,通过动态装载。
3.为了避免创建一个与产品类层次平行的工厂*层次时。
4.当一个类的实例只能有几个不同状态组合中的一种时。
建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
参与者
1. Prototype
声明一个克隆自身的接口。
2. ConcretePrototype
实现一个克隆自身的操作。
3. Client
让一个原型克*自身从而创建一个新的对象。
类图
例子
Prototype
public class Prototype implements Cloneable {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public Object clone(){
try {
return super.clone();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
ConcretePrototype
publ*c class ConcretePrototype extend* Prototype {
public ConcretePrototype(String name) {
setName(name);
}
}
Client
public clas* Test {
public static void main(String[] args) {
Prototype pro = new ConcretePrototy*e("prototype");
Prototype pro2 = (Prototype)pro.clone();*ystem.out.println(pro.getName()*;
System.out.println(pro2.getName());
}
}
result
prototype
prototype
小结:
原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。
例如: (1)QQ 聊天,别人向我们打招呼,我们点个托管,设置对面内容,然后就自动回复了。(2)设立原始尺寸,然后就可以根据原型复制更多的出来,代码如下:
packagedesignpatterns.prototype;
//原型
interfacePrototype {
voidsetSize(intx);
voidprintSize();
}
// 一个具体类
classAimplementsPrototype, Cloneable {
privateintsize;
publicA(intx) {
this.size =(本文来自:WWW.xiaocaoFanwEn.cOM 小草范文网:java,策略模式,例子) x;
}
@Override
publicvoidsetSize(intx) {
this.size = x;
}
@Override
publicvoidprintSize() {
篇二:java设计模式-策略模式
题目:Java设计模式-策略模式
姓名:苏欣雨
学号:
老师:
Java设计模式-策略模式
苏欣雨
2014141463173
目录
定义 ........................................................................................................................................... 2
结构 ........................................................................................................................................... 3
设计原则 ................................................................................................................................... 3
开闭原则 ............................................................................................................................... 3
封装变化原则 ....................................................................................................................... 4
优缺点 ....................................................................................................................................... 4
优点 ....................................................................................................................................... 4
缺点 ....................................................................................................................................... 4
应用举例 ................................................................................................................................... 4
源代码及注释 ....................................................................................................................... 5
示例一 ............................................................................................................................... 5
示例二 ............................................................................................................................... 9
总结 ......................................................................................................................................... 11
定义
策略(Strategy)模式:又名Policy,设计模式的作者把策略模式定义如下:
Define a family of algorithms, encapsulate each one, and make them interchangeable. [The] Strategy [pattern] lets the algorithm vary independently from clients that use it. 即:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。
策略模式让算法独立于使用它的客户而变化。其体现了这样两个原则——封装变化和对接口编程而不是对实现编程。策略模式可以独立于使用他们的客户端而变化。
结构
1) 抽象策略(Strategy)角色:抽象策略角色由抽象类或接口来承担,它给出具体策略角色需要实现的接口;
2) 具体策略(Concrete Strategy)角色:实现封装了具体的算法或行为;
3) 场景(环境)(Context)角色:持有抽象策略类的引用。
设计原则
开闭原则
策略模式是开闭原则的体现,开闭原则讲的是一个软件实体应该对扩展开放对修改关闭。策略模式在新的策略增加时,不会影响其他类的修改,增加了扩展性,
也就是对扩展是开放
的;对于场景来说,只依赖于抽象,而不依赖于具体实现,所以对修改是关闭的。 封装变化原则
策略模式在设计时是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(C++中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。策略模式重点就是封装不同的算法和行为,不同的场景下可以相互替换。也就是说如果一个程序的每个场景的算法相同也就没有必要使用策略模式了。
优缺点
优点
1) 将整个软件构建为可互换部分的松耦合的集合,而不是单一的紧耦合系统。在遵守大部
分GRASP原则和常用设计原则的同时实现了高内聚,低耦合,使得软件可扩展性更好,更易于维护且重用性好
2) 提供管理相关算法族的方法
3) 提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法
独立,可以任意扩展)
4) 可以避免多重条件判断语句的使用
缺点
1) 客户端必须知道所有的策略类
2) 由于类的增多,是系统需要进行维护的类更多
应用举例
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开能解决棘手问题,最后使周瑜赔了夫人又折兵,那咱们先看看这个场景是什么样子的。
先说说这个场景中的要素:三个妙计,一个锦囊,一个赵云。在不同的场景下赵云打开不同的锦囊,便化险为夷,锦囊便是抽象策略,具体的锦囊里面的计策便是具体的策略角色,而他们变化的处境就是不同的场景即环境。
源代码及注释
示例一
三个妙计是同一类型的东西,所以写一个接口:
package com.yangguangfu.strategy;
/**
*
* @author trygf521@126.com:
* 首先定义一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口。*/
public interface IStrategy {
//每个锦囊妙计都是一个可执行的算法。
public void operate();
}
然后再写三个实现类,因为有三个妙计,即用三种不同的算法:
妙计一:初到吴国:
package com.yangguangfu.strategy;
/**
*
* @author trygf521@126.com:
* 找乔国老帮忙,使孙权不能杀刘备。
*/
篇三:课题_《JAVA与模式》之策略模式
《JAVA与模式》之策略模式 源代码环境角色类
public class Context {
//持有一个具体策略的对象
private Strategy strategy;
/**
* 构造函数,传入一个具体策略对象
* @param strategy 具体策略对象
*/
public Context(Strategy strategy){
this.strategy = strategy;
}
/**
* 策略方法
*/
public void contextInterface(){
strategy.strategyInterface();
}
}
抽象策略类
public interface Strategy {
/**
* 策略方法
*/
public void strategyInterface();
}
具体策略类
public class ConcreteStrategyA implements Strategy {
@Override
public void strategyInterface() {
//相关的业务
}
}
public class ConcreteStrategyB implements Strategy {
@Override
public void strategyInterface() {
//相关的业务
}
}
public class ConcreteStrategyC implements Strategy {
@Override
public void strategyInterface() {
//相关的业务
}
}
使用场景
假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。
根据描述,折扣是根据以下的几个算法中的一个进行的:
算法一:对初级会员没有折扣。
算法二:对中级会员提供10%的促销折扣。
算法三:对高级会员提供20%的促销折扣。
使用策略模式来实现的结构图如下:
源代码
抽象折扣类
public interface MemberStrategy {
/**
* 计算图书的价格
* @param booksPrice 图书的原价
* @return 计算出打折后的价格
*/
public double calcPrice(double booksPrice);
初级会员折扣类
public
class
PrimaryMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double booksPrice) {
System.out.println("对于初级会员的没有折扣");
return booksPrice;
}
}
中级会员折扣类
public class IntermediateMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double booksPrice) {
System.out.println("对于中级会员的折扣为10%");return booksPrice * 0.9;
}
}
高级会员折扣类
public class AdvancedMemberStrategy implements MemberStrategy {
public double calcPrice(double booksPrice) {
System.out.println("对于高级会员的折扣为20%");return booksPrice * 0.8;
}
}
价格类
public class Price {
//持有一个具体的策略对象
private MemberStrategy strategy;
/**
* 构造函数,传入一个具体的策略对象
* @param strategy 具体的策略对象
*/
public Price(MemberStrategy strategy){
this.strategy = strategy;
}
/**
* 计算图书的价格
* @param booksPrice 图书的原价
* @return 计算出打折后的价格
*/
public double quote(double booksPrice){
return this.strategy.calcPrice(booksPrice); }
}
客户端