设计模式大类--行为模式(下)

七、Strategy(策略模式)
描述:定义了一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化。
优点:各个部分之间是弱连接
的关系,弱连接的特性使软件具有更强的可扩展性 ,易于维护 ;更重要的是,它大大提高了软件可重用性 。

例子:
举例(TreeSet 、TreeMap就是很好的例子 )
public class Test {

/*客户端*/
public static void main(String[] args) {

//面向接口
Strategy addStrategy = new AddStrategy();

Strategy subtractStrategy = new SubtractStrategy();
Environment envi
= new Environment(addStrategy);
System.out.println(envi.calculate(5,
2));

//策略的互换
envi.setStrategy(subtractStrategy);

System.out.println(envi.calculate(5, 2));

}
}
/*
*
抽象策略角色
* */
interface Strategy{
public int calculate(int a,int
b);
}

/*
* 具体策略角色,实现加法
* */
class AddStrategy implements Strategy{

@Override
public int calculate(int a, int b) {
return
a+b;
}
}

/*
* 具体策略角色,实现减法
* */
class SubtractStrategy implements
Strategy{

@Override
public int calculate(int a, int b) {
return
a-b;
}
}
/*
* 环境角色
* */
class Environment{

private Strategy strategy;

public void setStrategy(Strategy strategy) {
this.strategy =
strategy;
}

public Environment(Strategy strategy){
this.strategy =
strategy;
}
public int calculate(int a,int b){
return
strategy.calculate(a, b);
}
}

八、Mediator(中介者)
描述:用一个中介对象来封装一系列关于对象交互行为
优点:避免过度耦合,将一对多的关系简化为一对一的关系

举例:
有两个类A和B,类中各有一个数字,并且要保证类B中的数字永远是类A中数字的100倍。也就是说,当修改类A的数时,将这个数字乘以100赋给类B,而修改类B时,要将数除以100赋给类A。类A类B互相影响,就称为同事类。
abstract
class AbstractColleague {
protected int number;

public int
getNumber() {
return number;
}

public void
setNumber(int number){
this.number = number;
}

//注意这里的参数不再是同事类,而是一个中介者
public abstract void setNumber(int number,
AbstractMediator am);
}

class ColleagueA extends
AbstractColleague{

public void setNumber(int number,
AbstractMediator am) {
this.number = number;

am.AaffectB();
}
}

class ColleagueB extends
AbstractColleague{

@Override
public void setNumber(int
number, AbstractMediator am) {
this.number = number;

am.BaffectA();
}
}

abstract class AbstractMediator {

protected AbstractColleague A;
protected AbstractColleague B;


public AbstractMediator(AbstractColleague a, AbstractColleague b) {

A = a;
B = b;
}

public abstract
void AaffectB();

public abstract void BaffectA();

}

class Mediator extends AbstractMediator {

public
Mediator(AbstractColleague a, AbstractColleague b) {
super(a, b);

}

//处理A对B的影响
public void AaffectB() {
int
number = A.getNumber();
B.setNumber(number*100);
}


//处理B对A的影响
public void BaffectA() {
int number =
B.getNumber();
A.setNumber(number/100);
}
}


public class Client {
public static void main(String[] args){

AbstractColleague collA = new ColleagueA();

AbstractColleague collB = new ColleagueB();

AbstractMediator am
= new Mediator(collA, collB);

System.out.println("==========通过设置A影响B==========");

collA.setNumber(1000, am);

System.out.println("collA的number值为:"+collA.getNumber());

System.out.println("collB的number值为A的100倍:"+collB.getNumber());

System.out.println("==========通过设置B影响A==========");

collB.setNumber(1000, am);

System.out.println("collB的number值为:"+collB.getNumber());

System.out.println("collA的number值为B的0.01倍:"+collA.getNumber());

}

}

九、Interpreter(解释器)
描述:定义语言的文法
,并且建立一个解释器来解释该语言中的句子
优点:是一个简单语法分析工具,它最显著的优点就是扩展性,修改语法规则只要修改相应的非终结符表达式就可以了,若扩展语法,则只要增加非终结符类就可以了

例子:
为了帮助大家理解Interpreter模式的基本概念,我们在这里只举一个最简单的例子。
让一个表达式a经过PlusExpression解释器处理后使该表达式+1,经过MinusExpression解释器处理后使该表达式-1。
public
class Client {
public static void main(String []args) {
String
inputExpr = "10";

Context context = new
Context(inputExpr);

List list = new ArrayList();

list.add(new PlusExpression());
list.add(new
PlusExpression());
list.add(new MinusExpression());

list.add(new MinusExpression());
list.add(new MinusExpression());

for (int i=0;i<list.size();i++) {
AbstractExpression
expression = (AbstractExpression)list.get(i);

expression.interpret(context);
}

System.out.println(context.getOutput());
}
}

/**
* Context
*
*/
class Context {
private String
input;
private int output;

public Context (String input) {
this. input = input;

}

public String getInput() {
return input;
}

public void setInput(String input) {
this.input = input;

}

public int getOutput() {
return output;
}

public void setOutput(int output) {
this.output = output;

}
}

/**
* Expression & subclass
*
*/
abstract class
AbstractExpression {
public abstract void interpret(Context
context);
}

class PlusExpression extends AbstractExpression {
public void
interpret(Context context) {
System.out.println("PlusExpression
++");
String input = context.getInput();
int parsedResult
= Integer.parseInt(input);
parsedResult ++;

context.setInput(String.valueOf(parsedResult));

context.setOutput(parsedResult);
}
}

class MinusExpression extends AbstractExpression {
public void
interpret(Context context) {
System.out.println("PlusExpression
--");
String input = context.getInput();
int parsedResult =
Integer.parseInt(input);
parsedResult
--;
context.setInput(String.valueOf(parsedResult));

context.setOutput(parsedResult);
}
}

十、Visitor(访问者)
描述:作用于某个对象群中各个对象的操作.
它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作
优点:给原来类层次增加新操作,不必修改整个类层次,只需实现一个具体访问者

例子:
被访问者抽象类Node.java
abstract public class Node
{
public
abstract void accept(Visitor visitor);

/** @link dependency */

/*# Visitor lnkVisitorA; */
}

被访问者实现类NodeA
.java
public class NodeA extends Node
{
public void
accept(Visitor visitor)
{
visitor.visit(this);
}


public String operationA()
{
return "NodeA is
visited";
}
}

被访问者实现类NodeB .java
public class NodeB
extends Node
{
public void accept(Visitor visitor)
{

visitor.visit(this);
}

public String
operationB()
{
return "NodeB is visited";
}
}


访问者类Visitor.java
public class Visitor
{
public void
visit(NodeA nodeA)
{
System.out.println(
nodeA.operationA() );
}
public void visit(NodeB nodeB)

{
System.out.println( nodeB.operationB() );
}
}


增加与迭代被访问者类ObjectStructure.java
public class ObjectStructure
{

private Vector nodes;

/**
* @link aggregation

*/
private Node node;

public ObjectStructure()

{
nodes = new Vector();
}

public void
action(Visitor visitor)
{
for(Enumeration e =
nodes.elements();
e.hasMoreElements();)
{

node = (Node) e.nextElement();
node.accept(visitor);

}
}

public void add(Node node)
{

nodes.addElement(node);
}
}


客户端类Client.java
public class Client
{
private static
ObjectStructure aObjects;
private static Visitor visitor;

static public void main(String[] args)
{
aObjects = new
ObjectStructure();

aObjects.add(new NodeA());

aObjects.add(new NodeB());

visitor = new Visitor();

aObjects.action(visitor);

}
}

时间: 2024-11-09 00:53:24

设计模式大类--行为模式(下)的相关文章

设计模式大类--结构模式(下)

五.Decorate(装饰者)描述:动态的给一个对象添加额外的职责,比继承达到更好的灵活性好处:某些功能需要用户动态决定加入方式和时机,装饰者提供即插即用的模型 例子:举Adapter中的打桩示例,在Adapter中有两种类:方形桩 圆形桩,Adapter模式展示如何综合使用这两个类,在Decorator模式中,我们是要在打桩时增加一些额外功能,比如,挖坑 在桩上钉木板等,不关心如何使用两个不相关的类我们先建立一个接口:public interface Work{ public void ins

设计模式大类--结构模式(上)

大概有7中结构模式,分为上下两篇.一.Adapter(适配器)描述:将两个不兼容的类结合一起使用,一般需要用到其中某个类的若干方法好处:在两个类直接创建一个混合接口,而不必修改类里面的其他代码 例子:假设我们要打桩,有两种类:方形桩 圆形桩.public class SquarePeg{ public void insert(String str){ System.out.println("SquarePeg insert():"+str); } } public class Roun

设计模式大类--行为模式(上)

大概有10中行为模式,分为上中下三篇.一.Template(模板)描述:定义一些操作算法的骨架,将其实现延迟到其子类好处:扩展性强 例子:Java的抽象类本来就是Template模式,因此使用很普遍.而且很容易理解和使用,我们直接以示例开始: public abstract class Benchmark{ /** * 下面操作是我们希望在子类中完成 */ public abstract void benchmark(); /** * 重复执行benchmark次数 */ public fina

设计模式大类--行为模式(中)

四.Chain of Responsibility(责任链)描述:一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去好处:降低了类之间的耦合性 例子:抽象处理者角色public abstract class Handler { /** * 持有后继的责任对象*/protecte

大钟的ios开发之旅(2)————简单说说ios中ARC与非ARC模式下的property的变量修饰词

/******************************************************************************************** * author:[email protected]大钟 * E-mail:[email protected] *site:http://www.idealpwr.com/ *深圳市动力思维科技发展有限公司 * http://blog.csdn.net/conowen * 注:本文为原创,仅作为学习交流使用,转

0c-42-ARC模式下如何兼容非ARC的类

1.ARC模式下如何兼容非ARC的类 让程序兼容ARC和非ARC部分.转变为非ARC -fno-objc-arc 2.将MRC转换为ARC ARC也需要考虑循环引用问题:一端用strong,一端用weak. 提示:字符串是特殊的对象,但是不需要使用release手动释放,这种字符串对象默认就是autorelease,不需要额外管理内存. 如果一个项目是MRC的,那么我们可以把这个项目转换成ARC.

1.ARC模式下如何兼容非ARC的类

ARC模式下如何兼容非ARC的类 :转变为ARC的, -f-objc-arc 非ARC模式下如何兼容ARC的类 :转变为非ARC -fno-objc-arc

js架构设计模式——MVVM模式下,ViewModel和View,Model有什么区别

MVVM模式下,ViewModel和View,Model有什么区别 Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与数据库对应的model. View:也很简单,就是展现出来的用户界面. 基本上,绝大多数软件所做的工作无非就是从数据存储中读出数据,展现到用户界面上,然后从用户界面接收输入,写入到数据存储里面去.所以,对于数据 存储(model)和界面(view)这两层,大家基本没什么异议.但是,如何把model展现到view上,以及如何把数据从view写入到m

设计模式4 结构型模式

设计模式4  结构型模式 目录 代理模式 装饰器 外观模式 适配器模式 代理模式,美国,韩国代理购物 [email protected]:~$ cat main.cpp  #include<iostream> using namespace std; class Item //商品 { public: Item(string kind ,bool fact) { this->kind = kind; this->fact = fact; } string getKind() { r