`
wangpx
  • 浏览: 202368 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

组合模式 读书笔记

阅读更多

允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
创建一个树形结构,在同一个结构中处理嵌套菜单和菜单项组。通过将菜单和项放在相同的结构中,我们创建了一个“整体/部分”层次结构,即使由 菜单 和 菜单 项 组成 的 对象 树 。但是 可以 将 他视为 一个 整体,像是 一个 丰富的大菜单 。
1.我们应该努力让一个类只分配一个责任。
2.组合模式提供了一种结构,可同时包容个别对象和组合对象。
3。组合模式允许客户对个别对象和组合对象一视同仁。
4.组合结构内的任意对象称为组件,组件可以是组合,也可以是叶子节点。
5.在实现组合模式时,有许多设计上的 折中。你要根据需要平衡透明性和安全性。

package pattern; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.Stack; 
public class MenuTestDrive2 { 
public static void main(String[] args) { 
MenuComponent pancakeHouseMenu = new Menu("PANCAKE HOUSE MENU","Breakfast"); 
pancakeHouseMenu.add(new MenuItem("K&B'S Pancake Breakfast", 
"Pancakes with scrambled eggs,and toast", true, 2.99)); 
pancakeHouseMenu.add(new MenuItem("Regular Pancake Breakfast", 
"Pancakes with fried eggs,and sausage", true, 2.99)); 
pancakeHouseMenu.add(new MenuItem("BlueBerry Pancakes ", "Pancakes made with fresh blueberries", 
true, 3.49)); 
pancakeHouseMenu.add(new MenuItem("Waffles", 
"Waffles with your choice of blueberries or strawberries", 
true, 3.59)); 
MenuComponent dinerMenu = new Menu("DINER MENU","Lunch"); 
MenuComponent cafeMenu = new Menu("CAFE MENU","dINNER"); 
MenuComponent dessertMenu = new Menu("DESSERT MENU","Dessert of course!"); 
MenuComponent allMenus=new Menu("ALL MENUS","ALL menus combined"); 
allMenus.add(pancakeHouseMenu); 
allMenus.add(dinerMenu); 
allMenus.add(cafeMenu); 
cafeMenu.add(new MenuItem("Vegegie Burger and Air Fries", 
"Veggie burger on a whole wheat bun,lettuce,tomato,and fries", true, 
3.99)); 
dinerMenu.add(new MenuItem("Soup of the day", "A cup of the soup of the day,with a side salad", true, 
2.99)); 
dinerMenu.add(new MenuItem("Burrito", 
"A large burrito , with whole pinto beans,salsa,guacamole", true, 2.99)); 
dinerMenu.add(new MenuItem("Hotdog", 
"A hot dog, with saurkraut,relish,onions,topped with cheese", 
true, 2.99)); 
dinerMenu.add(new MenuItem("Pasta","Spaghetti with Marinara Sauce,and a slice of sourdough bread",true,3.89)); 
dinerMenu.add(dessertMenu); 
dessertMenu.add(new MenuItem("Apple Pie","Apple pie with a flakey crust,topped with vanilla ice cream",true,1.59)); 

Waiter waitress = new Waiter(allMenus); 
waitress.printMenu(); 
} 
} 
abstract class MenuComponent{ 
public void add(MenuComponent menuComponent){ 
throw new UnsupportedOperationException(); 
} 
public void remove(MenuComponent menuComponent){ 
throw new UnsupportedOperationException(); 
} 
public MenuComponent getChild(int i){ 
throw new UnsupportedOperationException(); 
} 
public String getName(){ 
throw new UnsupportedOperationException(); 
} 
public String getDescription(){ 
throw new UnsupportedOperationException(); 
} 
public double getPrice(){ 
throw new UnsupportedOperationException(); 
} 
public boolean isVegetarian(){ 
throw new UnsupportedOperationException(); 
} 
public void print(){} 
public Iterator createIterator(){ 
throw new UnsupportedOperationException(); 
} 
} 
class MenuItem extends MenuComponent{ 
String name; 
String description; 
boolean vegetarian; 
double price; 
public MenuItem(String name, String description, boolean vegetarian, 
double price) { 
this.name = name; 
this.description = description; 
this.vegetarian = vegetarian; 
this.price = price; 
} 
public String getName() { 
return name; 
} 
public String getDescription() { 
return description; 
} 
public boolean isVegetarian() { 
return vegetarian; 
} 
public double getPrice() { 
return price; 
} 
public void print(){ 
System.out.print(" "+getName()); 
if(this.isVegetarian()){ 
System.out.println("(v)"); 
} 
System.out.println(","+getPrice()); 
System.out.println(" ---"+getDescription()); 
} 
public Iterator createIterator(){ 
return new NullIterator(); 
} 
} 
class Menu extends MenuComponent{ 

ArrayList menuComponents=new ArrayList(); 
String name; 
String description; 
public Menu(String name,String description){ 
this.name=name; 
this.description=description; 
} 
public void add(MenuComponent menuComponent){ 
menuComponents.add(menuComponent); 
} 
public void remove(MenuComponent menuComponent){ 
menuComponents.remove(menuComponent); 
} 
public MenuComponent getChild(int i){ 
return (MenuComponent)menuComponents.get(i); 
} 
public String getName(){ 
return name; 
} 
public String getDescription(){ 
return description; 
} 

public void print(){ 
System.out.print("\n"+getName()); 
System.out.println(","+getDescription()); 
System.out.println("-------------------------"); 
Iterator iterator =(Iterator)menuComponents.iterator(); 
while(iterator.hasNext()){ 
MenuComponent menuComponent=(MenuComponent)iterator.next(); 
menuComponent.print(); 
} 
} 
public Iterator createIterator(){ 
return new CompositeIterator(menuComponents.iterator()); 
} 
} 
class CompositeIterator implements Iterator{ 
Stack stack=new Stack(); 
public CompositeIterator(Iterator iterator){ 
stack.push(iterator); 
} 
public Object next(){ 
if(hasNext()){ 
Iterator iterator=(Iterator)stack.peek(); 
MenuComponent component=(MenuComponent)iterator.next(); 
if(component instanceof Menu){ 
stack.push(component.createIterator()); 
} 
return component; 
}else{ 
return null; 
} 
} 
public boolean hasNext(){ 
if(stack.empty()){ 
return false; 
}else{ 
Iterator iterator =(Iterator)stack.peek(); 
if(!iterator.hasNext()){ 
stack.pop(); 
return hasNext(); 
}else{ 
return true; 
} 
} 
} 
public void remove(){ 
throw new UnsupportedOperationException(); 
} 
} 
class NullIterator implements Iterator{ 
public Object next(){ 
return null; 
} 
public boolean hasNext(){ 
return false; 
} 
public void remove(){ 
throw new UnsupportedOperationException(); 
} 
} 
class Waiter { 
MenuComponent allMenus; 
public Waiter(MenuComponent allMenus){ 
this.allMenus=allMenus; 
} 

public void printMenu() { 
this.allMenus.print(); 
} 
public void printVegetarianMenu(){ 
Iterator iterator=allMenus.createIterator(); 
System.out.println("\nVEGETARIAN MENU\n---"); 
while(iterator.hasNext()){ 
MenuComponent menuComponent=(MenuComponent)iterator.next(); 
try{ 
if(menuComponent.isVegetarian()){ 
menuComponent.print(); 
} 
} 
catch(UnsupportedOperationException e){} 
} 
} 
}

 

 

 

  • 大小: 668.1 KB
分享到:
评论

相关推荐

    设计模式读书笔记

    结构型模式则涉及如何组合类和对象,包括适配器、桥接、组合、装饰器、外观、享元和迭代器模式,它们提供了增强结构和解耦的手段。行为型模式专注于类或对象间的交互和职责分配,如模板方法、命令、解释器、责任链、...

    JAVA模式的读书笔记

    4. 合成/聚合复用原则(Composite/Aggregate Reuse Principle):优先使用对象的组合/聚合,而不是继承来达到复用的目的。这样可以减少类之间的耦合,提高系统的灵活性。 5. 迪米特法则(Law of Demeter):一个...

    JAVA与模式读书笔记。

    在《JAVA与模式读书笔记》中,我们探讨的是Java编程语言与设计模式的结合应用,这对于深入理解面向对象编程和提升软件开发能力至关重要。设计模式是软件工程中的最佳实践,它们是解决常见问题的模板,可以提高代码的...

    设计模式的读书总结笔记

    2. 结构型模式:包括适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。它们处理对象之间的关系,如组合...

    设计模式笔记

    抽象工厂模式同样遵循“开-闭”原则,提倡多用对象组合,少用继承,并且针对抽象编程。 建造者模式,又称为生成器模式,它将复杂对象的构建与其表示分离,使得相同的构建过程可以创建不同的表示。在手机套餐的例子...

    STM32读书笔记

    这两个引脚的状态组合定义了STM32上电或复位后的启动位置。具体来说: - 当BOOT0为低电平(0)且BOOT1任意状态时,STM32将从内置的闪存启动。 - 当BOOT0为高电平(1)且BOOT1为低电平时,STM32将从系统存储器...

    STL源码剖析读书笔记

    STL源码剖析读书笔记 STL(Standard Template Library)的源码剖析读书笔记是对经典著作的总结,涵盖了STL的六大组件、空间分配器、迭代器、仿函式、适配器和容器等知识点。 1. 六大组件 STL提供六大组件,彼此...

    《疯狂Android讲义》03章读书笔记(含源码)

    开发者可以利用这些组件组合出各种复杂的布局。 3. **事件处理**:Android使用监听器模式处理用户事件,如点击事件、滑动事件等。开发者可以通过实现或继承特定的接口,如OnClickListener、OnTouchListener,来注册...

    《Python编程金典》读书笔记.txt

    根据提供的文件信息,可以看出这是一份关于Python编程的学习笔记,主要涵盖了Python的基础知识、特性、用法以及一些高级主题如异常处理、文件操作等。下面将对这些知识点进行详细的整理和解释。 ### 1. Python基础 ...

    神经网络读书笔记.pdf

    《神经网络读书笔记》 神经网络是现代计算机科学中的重要组成部分,它模仿生物神经系统的结构和功能,以解决复杂的问题。神经网络的基础在于其由大量简单的处理单元——神经元构成,形成大规模并行分布式处理器。...

    基于Springboot的学生读书笔记共享系统源码数据库.doc

    综上所述,这个基于Spring Boot的学生读书笔记共享系统是一个典型的B/S架构应用,采用了Java语言、Spring Boot框架等技术栈进行开发。通过详细的需求分析、系统设计、编码实现以及测试部署等步骤,最终实现了系统的...

    2018教程读书笔记之oracle从入门到精通

    本教程读书笔记主要涵盖了Oracle的基础知识,适合初学者入门。以下是对笔记内容的详细解释: 1. **表的命名和访问**: - 表的全名由`用户名.表名`组成,访问当前用户的表时可以省略用户名,但访问其他用户下的表需...

    《数据挖掘》读书笔记.pdf

    《数据挖掘》读书笔记主要涵盖了数据可视化、建模方法、数据挖掘技术和预测分析的应用。作者Philipp K. Janer凭借其在物理学和软件工程领域的深厚背景,为读者提供了丰富的数据分析和数学建模知识。 在全书中,作者...

    golang-design-pattern:设计模式Golang实现-《研磨设计模式》读书笔记

    下面将详细讨论在标题"设计模式Golang实现-《研磨设计模式》读书笔记"中所涵盖的创建型模式、结构型模式和行为型模式。 1. 创建型模式: - 单例模式:确保一个类只有一个实例,并提供一个全局访问点。在Go中,...

    神经网络读书笔记.docx

    感知器是神经网络的一种简单形式,由线性组合器和硬限幅器组成,能将输入分为两类。感知器收敛定理证明了在适当条件下,感知器可以学习到将输入正确分类的权值。感知器的训练通常涉及迭代算法,以逐步优化权重。 ...

    经济发展理论读书笔记.pdf

    通过创新,旧的经济模式被打破,新的商业模式和生产方式得以诞生,这是资本主义经济不断进步的关键动力。 总结来说,熊彼特的创新理论强调了创新在经济发展中的核心地位,它不仅推动了经济增长,而且带来了经济结构...

    传智播客ssh+ssm五大框架笔记

    【传智播客SSH+SSM五大框架笔记】 在IT行业中,SSH(Struts2、Spring、Hibernate)和SSM(Spring、SpringMVC、MyBatis)是两种常见的Java Web开发框架组合,广泛应用于企业级应用开发。这些框架协同工作,能够帮助...

    这是一个有关CCIE读书笔记

    端口聚合协议(Port Aggregation Protocol, PAGP)和链路聚合控制协议(Link Aggregation Control Protocol, LACP)是用于组合多个物理接口形成逻辑上的单一高带宽通道的技术,增加链路的带宽并提高可靠性。...

    新课程读书笔记.doc

    1. 合理分组,优化组合。按照“组间同质,组内异质,优势互补,力量均衡”的原则,考虑学生的能力、性别等因素进行动态分组,确保每个小组内部既有互补性,又有竞争性。 2. 选择合适的内容和时机。合作学习应针对...

Global site tag (gtag.js) - Google Analytics