Java设计模式总汇二---MVC、中介者设计模式
PS:上一篇我介绍了适配器设计模式、单例设计模式、静态代理设计模式、简单工厂设计模式,如果没有看过第一篇的小火鸡可以点这个看看http://www.cnblogs.com/cmusketeer/p/8146510.html。这篇介绍一下
-
MVC设计模式
-
中介者设计模式
1:MVC设计模式
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。如果做过web项目的话,就会知道一些框架,比如说SSH(SpringMVC+Spring+Hibernate),当然有的这里的SpringMVC也可以是Struts,因为这都是MVC分层的一个框架。在web里的MVC可能比较比较好理解,因为View这个层可以直接显示出来,Controller可以直接用servlet。我们看到的网页端就是一个很好的证明(View)。其实,这个mvc和web的mvc都是一个原理,也可以说就是一种演变。
- Model(模型) – 模型代表一个存取数据的对象,也可以夹杂这一些逻辑,在数据变化时更新控制器。
- View(视图) – 视图代表模型包含的数据的可视化。
- Controller(控制器) – 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
这里我举一个简单的例子–用户(users)升级成为vip后刷新视图重新输入控制台。
(1)Model类–Users.java
该类只写了几个属性和set、get方法。包括名字、年龄、vip、描述。
package mvcmoshi; public class Users { public String name; public int age; public boolean vip; public String describe; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isVip() { return vip; } public void setVip(boolean vip) { this.vip = vip; } public String getDescribe() { return describe; } public void setDescribe(String describe) { this.describe = describe; } }
(2)视图层View
UsersView.java
package mvcmoshi; /** * View层 * 显示用户信息 * */ public class UsersView { public void showView(String name,int age,boolean vip,String describe){ System.out.println("用户资料调出"); if(vip){ System.out.println("姓名:"+name+",年龄:"+age+",身份:尊贵Vip"+",描述:"+describe); }else{ System.out.println("姓名:"+name+",年龄:"+age+",身份:平民"+",描述:"+describe); } } }
(3)控制层
package mvcmoshi; import mvcmoshi.Users; /** * 控制层 主要是写对View和Model的更新控制 * */ public class UsersController { public Users users; public UsersView userView; public UsersController(Users user, UsersView view) { this.users = user; this.userView = view; } public void setUsersName(String name) { users.setName(name); } public String getUsersName() { return users.getName(); } public void setUsersAge(int age) { users.setAge(age); } public int getUsersAge() { return users.getAge(); } public void setVip(boolean vip) { users.setVip(vip); } public boolean getVip() { return users.isVip(); } public void setDescribe(String describe) { users.setDescribe(describe); } public String getDescribe() { return users.getDescribe(); } /** * 更新方法 针对view中的方法 */ public void updateView() { userView.showView(users.getName(), users.getAge(), users.isVip(), users.getDescribe()); } }
这里写set和get方法,是因为控制层是更新数据一层,可以看出就算是在Controller里set和get,但对象依然是Users,在model(Users)类中取出数据在View中显示出来,这才是Controller做的事。上面什么都有了,那就开始测试一下吧,随便写一个带有main方法的类即可
(4)测试
package mvcmoshi; public class MainShow { public static void main(String[] args) { // TODO Auto-generated method stub //对用户进行赋值 Users usersModel=new Users(); usersModel.setName("张三"); usersModel.setAge(23); usersModel.setVip(false); usersModel.setDescribe("此人阴险狡诈,要小心。"); UsersView usersView=new UsersView(); UsersController usersController=new UsersController(usersModel, usersView); usersController.updateView(); //更新数据 usersModel.setVip(true); usersModel.setDescribe("此人乃是贵族vip"); usersController.updateView(); } }
效果图
2:中介者设计模式
定义:中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
何时使用:多个类相互耦合,形成了网状结构。
上面就是中介者的定义和使用技能,用通俗的话来解释的话就是多个类直接相互影响的时候,在中间加入一个处理层来管理或者处理一些操作,比如说,QQ聊天的时候,张三和李四聊天,相隔很远,他们只需要把说的话输入手机,对方就可以看到信息,这个手机就是一个中介者。也或者说,在很多人用手机聊天的过程中,两两相关,这就形成了网状结构,这时最好把两个人发送的数据都存在服务器上,然后通过服务器再往各处发放。下面我举一个简单的例子,这个例子很简单,主要是针对这个思想展开,代码就不复杂了。(红色为例子)
(1)创建中介者类
里面有一个是关于格式化时间的方法。
package zhongjiezhe; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Date; /** * 中介者 主要是协调各对象(如用户)之间的协作。 */ public class Service { /** * 格式化时间 */ public static String getNowDate() { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = formatter.format(currentTime); return dateString; } /*** * 显示消息方法 */ public void showMessage(User user, String message) { System.out.println(getNowDate() + "<" + user.getName() + ">:" + message); } }
(2)创建 人 类
package zhongjiezhe; public class User { private String name; private String message; public String getName() { return name; } public void setName(String name) { this.name = name; } public User(String name) { this.name = name; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public void sendMessage() { Service service = new Service(); service.showMessage(this, message); } }
(3)测试
package zhongjiezhe; public class MainShow { public static void main(String[] args) { User zhangsan=new User("张三"); User lisi=new User("李四"); zhangsan.setMessage("四哥,你下午有空吗?"); lisi.setMessage("三弟呀,我下午有空"); zhangsan.sendMessage(); lisi.sendMessage(); zhangsan.setMessage("那好,你帮我修一下我的电脑"); lisi.setMessage("没问题,记得请吃饭呦"); zhangsan.sendMessage(); lisi.sendMessage(); } }
效果图
总结:这个中介者模式按简单的说,就是这样的,因为我这个例子简单,所以有的小火鸡们会觉得不这样写也能达到我这个效果图,确实,我只是为了让大家一看就明白,主要是思想。有的时候我们可能一直这样写,但就是不知道这就是中介者模式。23中模式有的思路也有相似之处,这一个也是在中见加了一个中间层,静态代理也是加了中间层,然后中间层处理。中介者是一个处于众多对象中间,并处理对象之间的联系。本例子是两个人,如果是多个的话,中介者的作用就更明显了。