设计模式—–复杂模式
个人博客,想要搭建个人博客的可以进来看看: http://www.ioqian.top/
复合模式, 在一个解决方案中结合两个或多个模式,比如MVC设计模式,结合图片分析一下MVC中的三大设计模式
背景
还是按照鸭子来进行背景设计,通过不断加入新的模式来使用多种模式解决问题,但是将这些模式结合使用并不代表这些模式有资格称为复合模式
1.使用多种模式
一大波鸭子的叫声
public interface Quackable {
public void quack();
}
public class RedDuck implements Quackable {
@Override
public void quack() {
System.out.println("quack");
}
}
public class WhiteDuck implements Quackable {
@Override
public void quack() {
System.out.println("quack");
}
}
出现了鹅,可以使用适配器模式
public class Goose {
/**只有honk()方法*/
public void honk(){
System.out.println("honk");
}
}
//适配器模式
public class GooseAdapter implements Quackable {
Goose goose;
public GooseAdapter(Goose goose) {
this.goose = goose;
}
@Override
public void quack() {
goose.honk();
}
}
出现鸭子的计数,使用装饰者模式
public class QuackCounter implements Quackable {
Quackable duck;
static int numbersOfDuck;
public QuackCounter(Quackable duck) {
this.duck = duck;
}
@Override
public void quack() {
duck.quack();
numbersOfDuck++;
}
public static int getNumbersOfDuck(){
return numbersOfDuck;
}
}
测试Main
public class Main {
public static void main(String[] args) {
QuackCounter duck1 = new QuackCounter(new RedDuck());
QuackCounter duck2 = new QuackCounter(new WhiteDuck());
GooseAdapter duck3 = new GooseAdapter(new Goose());
duck1.quack();
duck2.quack();
duck3.quack();
System.out.println("鸭子的数目: " + QuackCounter.getNumbersOfDuck());
}
}
2.经典的复合模式 MVC(Model View Controller)
- Model对象:负责存储数据以及定义如何操作这些数据
- View对象:负责展示而且允许用户编辑来自应用程序的Model对象,View对象用来构建用户界面,与用户交互
- Controller对象:是Model对象与View对象的中间人,负责传递数据,监听各种事件,管理其他对象的生命周期等
View显示界面,当用户点击界面后,Controller需要作出响应,势必会改变一些数据的状态,这个时候需要把改变后的数据写入到Mode中保存并且让View更新;或者通过其他手段(非用户参与的,比如后台数据更新后)Mode数据更新了也要通知View更新,当View更新的时候需要从Mode获取数据进行显示,这就是MVC各个结构的作用
为什么说MVC是复合模式,因为他用到了观察者模式,策略模式,组合模式。模型利用观察者模式让控制器和试图可以随更新的状态而改变;视图和控制器实现了策略模式,控制器解释用户的点击动作,实现不同的控制器就可以改变不同的点击效果;视图内部使用组合模式管理UI显示。下面具体来分析
MVC中的观察者模式
模型实现了观察者模式,当状态改变时,相关对象持续更新,使用观察者模式可以让模型完全独立与视图和控制器,还可以同时使用多个视图
MCV中的策略模式
视图和控制器实现了策略模式,视图是一个对象,可以调整使用不同的策略,不同的控制器,从而实现不同的点击效果。使用策略模式可以让视图和模型解耦因为控制器负责和模型交互传递用户需求
MVC中的组合模式
在UI中,有各种组件和容纳组件的容器,比如android中的ViewGroup控件和View控件。当屏幕需要绘制时,只需要告诉顶层容器就可以了