博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之行为模式
阅读量:6649 次
发布时间:2019-06-25

本文共 7780 字,大约阅读时间需要 25 分钟。

hot3.png

设计模式之行为模式

一、概述

    1.1 简介

        java设计模式的分类中创建模式管理类在jvm中的生成和存在方式,结构模式可以看作是对存在的功能类的增强和延伸,充分利用了面向对象的三大特性:封装、继承、多态。那么个行为模式则是对不同功能类相互引用,相互联系做了示范作用,可以看作是结构模式的典型应用。

二、实例

    2.1 父类和子类

总结:1、在抽象类中提供一个公共功能,在其它子类中实现相同方法名、不同作用的功能(方法重写)。2、策略模式是利用接口、模版模式利用了抽象类的抽象方法(和接口一样)。3、利用装饰模式来构建功能模块,查看框架源码可,可以发现很多功能模块都是这么写的。策略模式://功能public interface ICalculator {	public int calculate(String exp);}//公共抽象类public abstract class AbstractCalculator {	// 抽象辅助类,提供公共功能	public int[] split(String exp, String opt) {		String array[] = exp.split(opt);		int arrayInt[] = new int[2];		arrayInt[0] = Integer.parseInt(array[0]);		arrayInt[1] = Integer.parseInt(array[1]);		return arrayInt;	}}//子类实现public class Minus extends AbstractCalculator implements ICalculator {	@Override	public int calculate(String exp) {		int arrayInt[] = split(exp, "\\*");		return arrayInt[0] * arrayInt[1];	}}public class Multiply extends AbstractCalculator implements ICalculator {	@Override	public int calculate(String exp) {		int arrayInt[] = split(exp, "\\+");		return arrayInt[0] + arrayInt[1];	}}//使用public class StrategyTest {	public static void main(String[] args) {		String exp = "2+8";		ICalculator cal = new Plus();		int result = cal.calculate(exp);		System.out.println(result);	}	//对同类问题的封装,一个抽象类实现公共功能,在利用不同子类实现不同实现功能}模版模式://公共抽象类public abstract class AbstractCalculator {	// 抽象辅助类,提供公共功能	public int[] split(String exp, String opt) {		String array[] = exp.split(opt);		int arrayInt[] = new int[2];		arrayInt[0] = Integer.parseInt(array[0]);		arrayInt[1] = Integer.parseInt(array[1]);		return arrayInt;	}	// 主要方法	public final int calculate(String exp, String opt) {		int array[] = split(exp, opt);		return calculate(exp, opt);	}	// 子类重新的方法	public abstract int calculator(int num1, int num2);}//子类public class Minus extends AbstractCalculator {	@Override	public int calculator(int num1, int num2) {		// TODO Auto-generated method stub		return num1 * num2;	}}public class Multiply extends AbstractCalculator {	@Override	public int calculator(int num1, int num2) {		// TODO Auto-generated method stub		return num1 * num2;	}}//测试public class StrategyTest {	public static void main(String[] args) {		String exp = "2+8";		AbstractCalculator avcal = new Plus();		int result = avcal.calculate(exp, "\\+");		System.out.println(result);	}	// 一个抽象类实现公共功能,利用抽象方法子类必须重写,来实现接口功能,当然可以不写接口}

    2.2 多个类之间

总结:这4种模式是java面向对象思想的很经典使用,各大框架都很常用。1.观察者模式:利用一个观察类,存放所有相同接口的子类,当一个类发生变化,进行轮训改变所有的类//观察类接口public interface Subject {	// 增加观察者	public void add(Observer observer);	// 删除观察者	public void del(Observer observer);	// 通知所用的观察者	public void notifyObserver();	// 自身的操作	public void operation();}//观察类public abstract class AbstractSubject implements Subject {	private Vector
 vector = new Vector
(); @Override public void add(Observer observer) { //添加 vector.add(observer); } @Override public void del(Observer observer) { // 删除 vector.remove(observer); } @Override public void notifyObserver() { // 轮循 Enumeration
 enumo = vector.elements(); while (enumo.hasMoreElements()) { enumo.nextElement().update(); } }}//观察类实现public class MySubject extends AbstractSubject { @Override public void operation() { System.out.println("update self!"); //这里可以添加我们需要的改变触发形式 notifyObserver(); }}//相同功能、当然也可以叫做挂载点public interface Observer { public void update();} //具体的子类public class Observer2 implements Observer { @Override public void update() { System.out.println("observer2 has received"); }}public class Observer1 implements Observer { @Override public void update() { System.out.println("observer1 has received"); }}//测试public class ObserverTest { // 观察模式:通过一个观察类实现来遍历通知 public static void main(String[] args) { Subject sub = new MySubject(); sub.add(new Observer1()); sub.add(new Observer2()); sub.operation(); }}2.迭代模式:将公共方法单独拿出来,对原有的功能强化。主要是对一类模块的功能添加// 迭代器功能public interface Interator { // 迭代功能 public Object previous(); // 后移 public Object next(); public boolean hasNext(); // 取得第一个元素 public Object first();}//迭代器实现类:就像java里面的集合,如果需要添加新的公共功能,则可以利用这种方式public class MyIterator implements Interator { private Collection collection; private int pos = -1; // 采用的装饰模式,将聚合类放入 public MyIterator(Collection collection) { this.collection = collection; } @Override public Object previous() { if (pos > 0) { pos--; } return collection.get(pos); } @Override public Object next() { if (pos < collection.size() - 1) { pos++; } return collection.get(pos); } @Override public boolean hasNext() { if (pos < collection.size() - 1) { return true; } else { return false; } } @Override public Object first() { pos = 0; return collection.get(pos); }}//聚集对象public interface Collection { //装饰模式 public Interator iterator(); // 取得集合对象 public Object get(int i); // 集合大小 public int size();}//聚集对象实现public class MyCollection implements Collection { public String string[] = { "A", "B", "C", "D", "E" }; @Override public Interator iterator() { // 用装饰模式,在迭代器中操作功能 // 使用代理模式:在聚合类中实现迭代器 // 只要实现了聚合类必然实现了迭代器 return new MyIterator(this); } @Override public Object get(int i) { return string[i]; } @Override public int size() { return string.length; }}//测试public class Test { public static void main(String[] args) { Collection collection = new MyCollection(); Interator it = collection.iterator(); while (it.hasNext()) { System.out.println(it.next()); } }}3.责任链模式:利用装饰模式(java接口可以当作变量引用),来相互嵌套//挂载点public interface Handler { public void operater();}//抽象类实现public abstract class AbstractHandler { // 对操作类进行封装 // ?可以直接在子类中封装 private Handler handler; public Handler getHandler() { return handler; } public void setHandler(Handler handler) { this.handler = handler; }}//具体子类public class MyHandler extends AbstractHandler implements Handler { private String name; public MyHandler(String name) { this.name = name; } // 操作 @Override public void operater() { System.out.println(name + "deal!"); if (getHandler() != null) { getHandler().operater(); } }}//测试public class Test { public static void main(String[] args) { MyHandler h1 = new MyHandler("h1"); MyHandler h2 = new MyHandler("h1"); MyHandler h3 = new MyHandler("h1"); // 通过接口引用,将有相方法的类,通过地址链接起来 h1.setHandler(h2); h2.setHandler(h3); h1.operater(); }}// 也可以直接在子类中实现public class MyHandler2 { private String name; // 对操作类进行封装 // ?可以直接在子类中封装 private Handler handler; public Handler getHandler() { return handler; } public void setHandler(Handler handler) { this.handler = handler; } public MyHandler2(String name) { this.name = name; } // 操作 public void operater() { System.out.println(name + "deal!"); if (getHandler() != null) { getHandler().operater(); } }}4.命令模式:讲一个事件的每一个部分都分开实现,然后在相互调用。从而达到相互不影响//命令接口:功能一public interface Command { public void exe();    }//接受者接口:功能二public interface Recevier { public void action();}//执行者接口:功能三public interface Invoker { public void send();}//命令实现public class MyCommand implements Command { private Recevier reciver; // 装饰器 public MyCommand(Recevier reciver) { this.reciver = reciver; } @Override public void exe() { reciver.action(); }}//接受这实现public class FirestReceiver implements Recevier { @Override public void action() { System.out.println(" first: commond reciver!"); }}//发送者实现public class MyInvoker implements Invoker{ // 执行者 private Command command; public MyInvoker(Command command) { this.command = command; } public void send() { command.exe(); }}//测试public class Test { public static void main(String[] args) { Recevier receiver = new FirestReceiver(); Command cmd = new MyCommand(receiver);// 命令 Invoker invoker = new MyInvoker(cmd);// 命令发布者 invoker.send();// 执行 // 先将发布者、命令、接受者都解耦。然后通过装饰器:执行结果 // 和责任模式相似、都是通过对(相同接口)的来相互调用。 }}

    2.3 类的状态

        主要通过中间类存放类的状态,然后通过状态复制恢复。

    2.4 中间类

        通过中间类组合来各种功能类,降低不同功能之间的耦合,组合的灵活应用。一般作为框架的主类,包含了不同模块的所有功能。

转载于:https://my.oschina.net/u/2246410/blog/599136

你可能感兴趣的文章
MongoDB 笔记【1】
查看>>
为什么「告警等级」对缩短平均修复时间如此重要?
查看>>
ECMAScript 5 新特性 vol.2 - Array
查看>>
jQuery代码组织
查看>>
7大极好的移动应用开发J2ME工具
查看>>
7种JVM垃圾收集器特点,优劣势、及使用场景
查看>>
数字化经济具备的三大特征
查看>>
ZooKeeper分布式架构实战系列(01):ZooKeeper概念、功能、架构、与使用场景和面试题 ...
查看>>
CSS_伪元素_伪类
查看>>
ORACLE中Like与Instr模糊查询性能大比拼
查看>>
【深度分析】汽车零部件供应商管理+采购体系
查看>>
linux 天才排序算法??
查看>>
Java单例设计模式的理解与常规实现方式
查看>>
正则表达式上——基本语法
查看>>
PHPStorm File and Code Template
查看>>
AI技术加速普及喜大普奔?微软CTO认为应持谨慎乐观的态度
查看>>
mysql pxc强一致性集群
查看>>
SpringBoot三部曲之Controller 请求日志切面 AOP
查看>>
Innodb:insert 第一次进行乐观插入逻辑(二级索引)
查看>>
PHP异步:在PHP中使用 fsockopen curl 实现类似异步处理的功能
查看>>