本文主要用作学习记录,参考headfirst设计模式
设计原则:找出应用中可能需要变化之外,把它们独立出来,不要和那些不需要变化的代码混在一起
设计原则:针对接口编程,而不是针对实现编程
设计原则:多用组合,少用继承
设计原则:类应该对扩展开放,对修改关闭
设计原则:一个类应该只有一个引起变化的原因
组合模式允许你将对象组合成树结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合
//定义数据结构
public 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(){
throw new UnsupportedOperationException();
}
}
//多个menu集合
public class Menu extends MenuComponent {
ArrayList menuComponents = new ArrayList();
String name;
String description;
public Menu(String name,String description){
this.name = name;
this.description = description;
}
@Override
public void remove(MenuComponent menuComponent) {
menuComponents.remove(menuComponent);
}
@Override
public void add(MenuComponent menuComponent) {
menuComponents.add(menuComponent);
}
@Override
public MenuComponent getChild(int i) {
return (MenuComponent) menuComponents.get(i);
}
@Override
public String getName() {
return name;
}
@Override
public String getDescription() {
return description;
}
@Override
public void print() {
System.out.println("\n" +getName());
System.out.println(", "+ getDescription());
System.out.println("--------------------");
Iterator iterator = menuComponents.iterator();
while(iterator.hasNext()){
((MenuComponent)iterator.next()).print();
}
}
}
//单个item相关信息
public 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;
}
@Override
public String getName() {
return name;
}
@Override
public String getDescription() {
return description;
}
@Override
public double getPrice() {
return price;
}
@Override
public boolean isVegetarian() {
return vegetarian;
}
@Override
public void print() {
System.out.println(" "+getName());
if(isVegetarian()){
System.out.println("(v)");
}
System.out.println("," + getPrice());
System.out.println(" -- "+getDescription());
}
}
设计原则:找出应用中可能需要变化之外,把它们独立出来,不要和那些不需要变化的代码混在一起
设计原则:针对接口编程,而不是针对实现编程
设计原则:多用组合,少用继承
设计原则:类应该对扩展开放,对修改关闭
设计原则:一个类应该只有一个引起变化的原因
组合模式允许你将对象组合成树结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合
//定义数据结构
public 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(){
throw new UnsupportedOperationException();
}
}
//多个menu集合
public class Menu extends MenuComponent {
ArrayList menuComponents = new ArrayList();
String name;
String description;
public Menu(String name,String description){
this.name = name;
this.description = description;
}
@Override
public void remove(MenuComponent menuComponent) {
menuComponents.remove(menuComponent);
}
@Override
public void add(MenuComponent menuComponent) {
menuComponents.add(menuComponent);
}
@Override
public MenuComponent getChild(int i) {
return (MenuComponent) menuComponents.get(i);
}
@Override
public String getName() {
return name;
}
@Override
public String getDescription() {
return description;
}
@Override
public void print() {
System.out.println("\n" +getName());
System.out.println(", "+ getDescription());
System.out.println("--------------------");
Iterator iterator = menuComponents.iterator();
while(iterator.hasNext()){
((MenuComponent)iterator.next()).print();
}
}
}
//单个item相关信息
public 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;
}
@Override
public String getName() {
return name;
}
@Override
public String getDescription() {
return description;
}
@Override
public double getPrice() {
return price;
}
@Override
public boolean isVegetarian() {
return vegetarian;
}
@Override
public void print() {
System.out.println(" "+getName());
if(isVegetarian()){
System.out.println("(v)");
}
System.out.println("," + getPrice());
System.out.println(" -- "+getDescription());
}
}
//测试
public class TestCompoent {
public static void main(String[] args) {
Menu totalMenuItem = new Menu("total","total menu item");
MenuItem breakfast = new MenuItem("breakfast","this is breakfast",true,0.89);
MenuItem lunch = new MenuItem("lunch","this is lunch",true,1.50);
MenuItem dinner = new MenuItem("dinner","this is dinner",true,2.78);
totalMenuItem.add(breakfast);
totalMenuItem.add(lunch);
totalMenuItem.add(dinner);
totalMenuItem.print();
}
}