[19/04/30-星期二] GOF23_行为型模式(中介者模式、命令模式、解释器模式、访问者模式)
一、中介者模式(meditor)
【中介】
/***
* 抽象中介者接口和其具体实现类"经理"类
*/
package cn.sxt.meditor; import java.util.HashMap;
import java.util.Map; public interface Mediator {
void register(String dName,Department d);//自己部门名字
void command(String dName);//向别的部门发布命令 }
//经理类
class Manger implements Mediator{
private Map<String, Department> map=new HashMap<String, Department>(); public void register(String dName, Department d) {
map.put(dName, d); } public void command(String dName) {
map.get(dName).selfAction();//调用财务部回到这里。map调用传进来的部门的本来职责selfAction() } }
【同事】
/***
* "同事"类的接口 和3个同事类
*/
package cn.sxt.meditor; public interface Department {
void selfAction();//做本部门的事情
void outAction();//向总经理发出申请
} //研发部
class Development implements Department{
private Mediator mediator;//持有中介者(这里指的是总经理,得知道总经理是谁)的引用 public Development(Mediator mediator) {
super();
this.mediator = mediator;
mediator.register("研发部", this);//当前对象(研发部)报给中介者(总经理)知晓
} public void selfAction() {
System.out.println("专心科研,研发项目!");
} public void outAction() {
System.out.println("汇报工作:需要资金支持!"); }
} //财务部
class Financial implements Department{
private Mediator mediator;//持有中介者(这里指的是总经理,得知道总经理是谁)的引用 public Financial(Mediator mediator) {
super();
this.mediator = mediator;
mediator.register("财务部", this);//当前对象(研发部)报给中介者(总经理)知晓
} public void selfAction() {
System.out.println("对内发工资!");
} public void outAction() {
System.out.println("汇报工作:没钱了,债主上门了!"); }
} //市场部
class Market implements Department{
private Mediator mediator;//持有中介者(这里指的是总经理,得知道总经理是谁)的引用 public Market(Mediator mediator) {
super();
this.mediator = mediator;
mediator.register("市场部", this);//当前对象(研发部)报给中介者(总经理)知晓
} public void selfAction() {
System.out.println("开拓国内市场!");
} public void outAction() {
System.out.println("汇报工作:市场不好开展呀!");
mediator.command("财务部");//市场部去调用财务部 }
}
【客户】
/**
*
*/
package cn.sxt.meditor; public class Client {
public static void main(String[] args) {
Mediator mediator=new Manger(); Market market=new Market(mediator);//把中介者传进去
Development development=new Development(mediator);
Financial financial=new Financial(mediator); market.selfAction();//市场部自己的职责
market.outAction();//市场部去找经理要钱,经理找财务部
} }
二、命令模式(command) 用的很少
【命令】
/**
*
*/
package cn.sxt.command; public interface Command {
//实际项目中根据需求设计多个不同的方法
void execute(); } class ConcreteCommand implements Command{
private Receiver receiver;//命令真正的执行者对象 public ConcreteCommand(Receiver receiver) {
super();
this.receiver = receiver;
} public void execute() { receiver.action();
} }
【接收者】
/***
* 命令真正的执行者 。广大的指战员们
*/
package cn.sxt.command; public class Receiver {
public void action() {
System.out.println("4月21日渡江!");
} }
【发起者】
/***
* 命令的发起者
*/
package cn.sxt.command; public class Invoke {
private Command command; //可以写多条,采用容器 public Invoke(Command command) {
super();
this.command = command;
} //用于调用命令类的方法
public void call() {
command.execute();
} }
【客户】
/**
* 客户端
*/
package cn.sxt.command; public class Client {
public static void main(String[] args) {
Command command=new ConcreteCommand(new Receiver()); Invoke invoke=new Invoke(command);
invoke.call();
} }
三、解释器模式(Interpreter) 屠龙之技
MESP的网址: http://sourceforge.net/projects/expression-tree/
Expression4J的网址: http://sourceforge.net/projects/expression4j/
四、访问者模式
[19/04/30-星期二] GOF23_行为型模式(中介者模式、命令模式、解释器模式、访问者模式)的更多相关文章
- [19/04/28-星期日] GOF23_结构型模式(享元模式)
一.享元模式(FlyWeight,轻量级) [共享类与非共享类] /*** *FlyweightFactory享元工厂类: 创建并管理享元对象,享元池一般设计成键值对 */ package cn.sx ...
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
- 深入浅出设计模式——访问者模式(Visitor Pattern)
模式动机 对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生 ...
- 折腾Java设计模式之访问者模式
博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...
- C#设计模式-访问者模式
一. 访问者(Vistor)模式 访问者模式是封装一些施加于某种数据结构之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变.访问者模式适用于数据结构相对稳定的系统, 它把数据结 ...
- C#设计模式(22)——访问者模式(Vistor Pattern)
一.引言 在上一篇博文中分享了责任链模式,责任链模式主要应用在系统中的某些功能需要多个对象参与才能完成的场景.在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式 ...
- c++ 访问者模式(visitor pattern)
概述: 我们去银行柜台办业务,一般情况下会开几个个人业务柜台的,你去其中任何一个柜台办理都是可以的.我们的访问者模式可以很好付诸在这个场景中:对于银行柜 台来说,他们是不用变化的,就是说今天和明天提供 ...
- C++设计模式——访问者模式
访问者模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的 ...
- 【22】访问者模式(Visitor Pattern)
一.引言 在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式的定义 访问者模式是封装一些施加于某种数据结构之上的操作.一旦这些操作需要修改的话,接受这个操作的数 ...
- 访问者模式(Visitor、Element、accept、ObjectStructure、)(操作外置,与数据结构分离)
访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作.从定义可以看出结构对象是使用访问者模式的必备条件,而且这个结构对象必须存在遍历自身各个 ...
随机推荐
- ASP.NET HttpWebRequest和HttpWebResponse
HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.它们支持一系列有用的属性. 模拟艺龙旅游网登录 想模拟登录,首先整理一下流程 1.通过360浏览器 ...
- Spring 学习(十)--- Dispatch 分发逻辑
问题 : Spring 分发逻辑是如何的 概述 本文讲解Spring 请求到返回视图的分发过程. 分发逻辑 分发逻辑可以使用下图来表示. 总共七个步骤 : 接收请求,经过 DispatcherServ ...
- jQuery 关于IE9上传文件无法进入后台问题的原因及解决办法(ajaxfileupload.js第四弹)
第四弹的诞生完全不在自己最初的计划之中,是有个网友看了先前关于<ajaxfileupload.js系列>的文章后提出的问题,由于自己一直是用chrome浏览器去测试demo,完全忽略IE浏 ...
- MyBatis缓存通俗易懂
1.1 mybatis缓存介绍 如下图,是mybatis一级缓存和二级缓存的区别图解: Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的 ...
- PDO drivers no value in Windows 或 ndefined class constant 'MYSQL_ATTR_USE_BUFFERED_QUERY'
把办公室的drupal7.54版本放到自己的笔记本(OS:Windows10 Pro,php:7.0.9,mysql 5.7.11,apache:2.4)上运行不了,查看了各项配置应该没问题啊.之前还 ...
- Shellinabox安装及使用教程
本文转载自: shellinabox:一款使用 AJAX 的基于 Web 的终端模拟器 一.shellinabox简介 通常情况下,我们在访问任何远程服务器时,会使用常见的通信工具如OpenSSH和P ...
- 【javascript】javascript设计模式之工厂模式
1.要解决的问题 2.如何实现 3.与构造函数的区别 4.总结 1.要解决的问题 工厂模式通常用于重复创建相似对象,提供动态创建对象的接口. 2.工厂模式最为设计模式中构造模式之一,通常在类或类的静态 ...
- C语言写控制台互交界面
void show_menu() { //system("clear"); printf("---------------------\n"); printf( ...
- macvtap与vhost-net技术
MacVlan的功能是给同一个物理网卡配置多个MAC地址,可以在软件上配置多个以太网口,属于物理层的功能.MacVTap是用来替代TUN/TAP和Bridge内核模块的.MacTap是基于MacVla ...
- 数据预处理(Python scikit-learn)
在机器学习任务中,经常会对数据进行预处理.如尺度变换,标准化,二值化,正规化.至于采用哪种方法更有效,则与数据分布和采用算法有关.不同算法对数据的假设不同,可能需要不同的变换,而且有时无需进行变换,也 ...