`

复合模式

阅读更多

复合模式:结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。

 

男人、机器人、狗。人都可以说话,狗不会说话。

通过适配器模式,让狗也可以说话。

通过装饰者模式,统计说话次数。

通过工厂模式,来创建人。

通过组合模式,管理一群人。

 

通过观察者模式,观察机器人说话。

 

 

package com.ez.biz;

import com.ez.AbstractPersonFactory;
import com.ez.Person;
import com.ez.impl.Android;
import com.ez.impl.Dog;
import com.ez.impl.DogAdapter;
import com.ez.impl.Human;
import com.ez.impl.Man;
import com.ez.impl.PersonCount;
import com.ez.impl.PersonCountFactory;
import com.ez.impl.Screen;

/**
 * @author 窗外赏雪(EZ编程网)
 */
public class Test {
	
	static void talk(Person person){
		person.talk();
	}
	
	public static void main(String[] args) {
		System.out.println("=======使用适配器模式,适配狗说话=======");
		Person person=new Android();
		talk(person);
		person=new Man();
		talk(person);
		person=new DogAdapter(new Dog());
		talk(person);
		
		System.out.println("=========使用装饰者模式统计说话次数========");
		person=new PersonCount(new Man());
		talk(person);
		person=new PersonCount(new Android());
		talk(person);
		person=new PersonCount(new DogAdapter(new Dog()));
		talk(person);
		System.out.println("===说话次数为:"+PersonCount.getTalkNum()+"===");
		
		System.out.println("======使用工厂方式创建======");
		AbstractPersonFactory factory=new PersonCountFactory();
		person=factory.createAndroid();
		talk(person);
		person=factory.createMan();
		talk(person);
		
		System.out.println("=======使用组合模式管理一群人=========");
		Human persons=new Human();
		persons.add(factory.createMan());
		persons.add(factory.createAndroid());
		
		Human persons1=new Human();
		persons1.add(factory.createAndroid());
		persons1.add(factory.createAndroid());
		persons1.add(factory.createAndroid());
		persons1.add(factory.createAndroid());
		
		persons.add(persons1);
		talk(persons);
		
		System.out.println("====使用观察者模式,观察机器人说话====");
		Android android=new Android();
		Screen screen=new Screen();
		android.registerObserver(screen);
		android.talk();
		
	}
}
 
package com.ez;
/**
 * 人接口,狗适配器需要实现此接口
 * @author 窗外赏雪(EZ编程网)
 */
public interface Person {
	/**
	 * 人都会说话
	 */
	void talk();
}
 
package com.ez.impl;

import com.ez.Observer;
import com.ez.Person;
import com.ez.PersonObservable;
/**
 * 机器人,通过组合,实现被观察者的行为。
 * @author 窗外赏雪(EZ编程网)
 *
 */
public class Android implements Person,PersonObservable{
	private Observable observable;
	public Android() {
		observable=new Observable(this);
	}
	
	@Override
	public void talk() {
		System.out.println("你好,我们机器人。");
		notifyObservers();
	}

	@Override
	public void registerObserver(Observer observer) {
		observable.registerObserver(observer);
	}

	@Override
	public void notifyObservers() {
		observable.notifyObservers();
	}

}
 
package com.ez.impl;

import com.ez.Person;
/**
 * 男人,是人,会说话
 * @author 窗外赏雪(EZ编程网)
 */
public class Man implements Person{

	@Override
	public void talk() {
		System.out.println("你好,我是男人");
	}

}
 
package com.ez.impl;
/**
 * 狗不是人,不会说话,要想说话,必须通过DogAdapter适配器。
 * @author 窗外赏雪(EZ编程网)
 */
public class Dog {
	/**
	 * 狗不会说话,只会叫
	 */
	public void shout(){
		System.out.println("汪汪");
	}
}
 
package com.ez.impl;

import com.ez.Person;
/**
 * 狗适配器,让狗可以说话,实现person接口
 * @author 窗外赏雪(EZ编程网)
 */
public class DogAdapter implements Person{
	private Dog dog;
	public DogAdapter(Dog dog) {
		this.dog=dog;
	}
	@Override
	public void talk() {
		dog.shout();
	}
}
 
package com.ez.impl;

import com.ez.Person;
/**
 * person装饰者,用于统计人的说话次数。
 * @author 窗外赏雪(EZ编程网)
 */
public class PersonCount implements Person{
	
	private Person person;
	private static int numberOfTalk;
	
	public PersonCount(Person person) {
		this.person=person;
	}

	@Override
	public void talk() {
		person.talk();
		numberOfTalk++;
	}
	
	public static int getTalkNum(){
		return numberOfTalk;
	}
}
 
package com.ez;
/**
 * 工厂抽象类
 * @author 窗外赏雪(EZ编程网)
 */
public abstract class AbstractPersonFactory {
	public abstract Person createMan();
	public abstract Person createAndroid();
}
 
package com.ez.impl;

import com.ez.AbstractPersonFactory;
import com.ez.Person;
/**
 * 创建人的工厂
 * @author 窗外赏雪(EZ编程网)
 */
public class PersonFactory extends AbstractPersonFactory{

	@Override
	public Person createMan() {
		return new Man();
	}

	@Override
	public Person createAndroid() {
		return new Android();
	}

}
 
package com.ez.impl;

import com.ez.AbstractPersonFactory;
import com.ez.Person;
/**
 * 创建人的装饰者的工厂
 * @author 窗外赏雪(EZ编程网)
 */
public class PersonCountFactory extends AbstractPersonFactory {

	@Override
	public Person createMan() {
		return new PersonCount(new Man());
	}

	@Override
	public Person createAndroid() {
		return new PersonCount(new Android());
	}

}
 
package com.ez.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.ez.Person;
/**
 * 组合模式的数据结构,无差异的处理一个和一组person对象。
 * @author 窗外赏雪(EZ编程网)
 */
public class Human implements Person{
	
	private List<Person> persons=new ArrayList<Person>();

	public void add(Person person){
		persons.add(person);
	}
	
	@Override
	public void talk() {
		Iterator<Person> iterator=persons.iterator();
		while(iterator.hasNext()){
			Person person=(Person)iterator.next();
			person.talk();
		}
	}
	
}
 
package com.ez;
/**
 * 观察者接口
 * @author 窗外赏雪(EZ编程网)
 */
public interface Observer {
	void update(PersonObservable person);
}
 
package com.ez.impl;

import com.ez.Observer;
import com.ez.PersonObservable;
/**
 * 观察者,可以观察被观察者(人)
 * @author 窗外赏雪(EZ编程网)
 */
public class Screen implements Observer{
	
	@Override
	public void update(PersonObservable person) {
		System.out.println("观察到说话了"+person.toString());
	}
}
 
package com.ez;
/**
 * 被观察者接口,主题,可以订阅观察者,通知观察者。
 * @author 窗外赏雪(EZ编程网)
 */
public interface PersonObservable {
	void registerObserver(Observer observer);
	void notifyObservers();
}
 
package com.ez.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.ez.Observer;
import com.ez.PersonObservable;
/**
 * 被观察者实现类,通过组合此类。
 * @author 窗外赏雪(EZ编程网)
 */
public class Observable implements PersonObservable{
	private List<Observer> observers=new ArrayList<Observer>();
	private PersonObservable person;
	
	public Observable(PersonObservable person) {
		this.person=person;
	}
	
	@Override
	public void registerObserver(Observer observer) {
		observers.add(observer);
	}

	@Override
	public void notifyObservers() {
		Iterator<Observer> iterator=observers.iterator();
		while(iterator.hasNext()){
			Observer observer=iterator.next();
			observer.update(person);
		}
	}
}
  

MVC是复合模式,结合了观察者模式、策略模式和组合模式。

 

我们通过MVC,来学习复合模式。

视图:用来呈现模型。视图通常直接从模型中取得它需要显示的状态和数据。

控制器:取得用户的输入并解读其对模型的意思。

模型:模型持有所有的数据、状态和程序逻辑。

 

非web版MVC(Model1)

 

模型利用“观察者”让控制器和视图可以随最新的状态改变而更新。

 

视图和控制器实现了“策略模式”,视图是一个对象,可以被调整使用不同的策略,而控制器提供了策略。

视图只关心系统中的可视部分,对于任何界面行为,都委托给控制器处理。

使用策略模式也可以让视图和模型之间的关系解耦,因为控制器负责和模型交互来传递用户的请求。对于工作是怎么完成的,视图豪不知情。

 

视图内部使用组合模式来管理窗口、按钮以及其他显示组件。

分享到:
评论

相关推荐

    深入浅出设计模式之复合模式

    根据提供的信息,我们可以了解到本文主要关注的是《Head First 设计模式》一书中关于“复合模式”的相关内容。虽然未提供具体章节的内容,但基于标题、描述和标签,我们可以深入探讨复合模式的基本概念、应用场景...

    java设计模式-复合模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

    12-复合模式.pdf

    ### 复合模式详解 #### 一、复合模式概述 复合模式(Composite Pattern),也称为部分-整体模式(Part-Whole Pattern),是一种结构型设计模式。它的主要目的是将多个简单的对象组合成一个复杂的对象,从而形成一...

    【Qt】2D绘图之复合模式.rar

    在Qt库中,2D绘图是开发图形用户界面(GUI)的重要组成部分,而复合模式则是其中的关键技术之一。复合模式允许开发者通过控制图形元素如何重叠和混合,实现复杂而富有层次的视觉效果。本资源包“【Qt】2D绘图之复合...

    复合模式的应用

    复合模式的应用涉及到两种经典的设计模式:抽象工厂模式和单件模式。这两种模式在软件设计中都有着广泛的应用,它们能提升代码的可复用性和可维护性。 首先,我们来探讨抽象工厂模式。这个模式提供了一个创建一系列...

    大数据架构和模式(四)了解用于大数据解决方案的原子模式和复合模式.pdf

    本文主要关注原子模式和复合模式,这两种模式是构建高效大数据解决方案的基础。 原子模式是对大数据环境下常见问题的抽象,用于描述数据的使用、处理、访问和存储方式。原子模式包括: 1. 访问模式:针对不同类型和...

    大数据架构和模式(四)了解用于大数据解决方案的原子模式和复合模式.docx

    这些模式包括原子模式和复合模式,它们为处理、存储、访问和使用大数据提供了指导框架。在大数据解决方案中,原子模式是基本构建块,针对特定问题提供解决方案,而复合模式则是由多个原子模式组合而成,适用于更复杂...

    Qt加载图片(复合模式)

    复合模式是指通过组合多个图像或元素来创建一个更复杂的图像展示。本篇将深入探讨如何在Qt中加载图片,并利用复合模式来实现更丰富的图形效果。 首先,我们要了解Qt中的基本图像类`QImage`和`QPixmap`。`QImage`是...

    了解用于大数据解决方案的原子模式和复合模式

    复合模式由原子模式组成,并根据大数据解决方案的范围进行分类。由于每个复合模式都有若干个维度,所以每个模式都有许多变化。复合模式使得业务和技术用户可以应用一个结构化方法为大数据问题建立范围,并定义高级的...

    小镇中心“7x24”复合模式初探131页.pptx

    【小镇中心及相关概念定义】 小镇中心,又可称为城镇中心,是乡村地区的核心..."7X24"复合模式和学院功能主导的实践,为现代小镇建设提供了新的思路,旨在创建一个既满足现代生活需求,又充满活力和魅力的社区环境。

    三倍体毛白杨与黑麦草复合模式细根和草根分解的动态研究

    三倍体毛白杨与黑麦草复合模式细根和草根分解的动态研究,范冰,李贤伟,在天全县的退耕还林地中,对三倍体毛白杨+黑麦草细根和草根的分解及其N、P、K、Ca、Mg养分释放动态进行研究。细根Ø0-1 mm、Ø

    CompositePattern:复合设计模式示例

    复合图案复合图案的例子当我们需要以类似的方式将一组对象视为单个对象时,使用复合模式。 合成模式以树结构的形式构成对象,以表示部分以及整个层次结构。 这种设计模式属于结构模式,因为该模式创建了一组对象的树...

    C++ 设计模式(复合)

    vs2013工程的设计模式,根据《head first设计模式》改写的一个多模式协作的例子。结合着 http://download.csdn.net/detail/ustb_atrx/9434958 一起看比较好。

    C#复合模式(Composite Pattern)实例教程

    【C#复合模式(Composite Pattern)实例教程】 复合模式是一种设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。复合模式使得客户端代码能够一致地处理单个对象和对象组合,也就是说,客户端...

Global site tag (gtag.js) - Google Analytics