Head First设计模式学习笔记
一、策略模式
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
package cn.juwatech.strategy;
interface QuackBehavior {
void quack();
}
class Quack implements QuackBehavior {
public void quack() {
System.out.println("Quack");
}
}
class Squeak implements QuackBehavior {
public void quack() {
System.out.println("Squeak");
}
}
abstract class Duck {
QuackBehavior quackBehavior;
public void performQuack() {
quackBehavior.quack();
}
public void setQuackBehavior(QuackBehavior qb) {
this.quackBehavior = qb;
}
abstract void display();
}
class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
}
void display() {
System.out.println("I'm a Mallard Duck");
}
}
public class StrategyPatternDemo {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.setQuackBehavior(new Squeak());
mallard.performQuack();
}
}
二、观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新。
package cn.juwatech.observer;
import java.util.ArrayList;
import java.util.List;
interface Observer {
void update(float temp, float humidity, float pressure);
}
interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
class WeatherData implements Subject {
private List<Observer> observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers = new ArrayList<>();
}
public void registerObserver(Observer o) {
observers.add(o);
}
public void removeObserver(Observer o) {
observers.remove(o);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(temperature, humidity, pressure);
}
}
public void measurementsChanged() {
notifyObservers();
}
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
}
class CurrentConditionsDisplay implements Observer {
private float temperature;
private float humidity;
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
public void update(float temp, float humidity, float pressure) {
this.temperature = temp;
this.humidity = humidity;
display();
}
public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
}
public class ObserverPatternDemo {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
weatherData.setMeasurements(80, 65, 30.4f);
weatherData.setMeasurements(82, 70, 29.2f);
}
}
三、装饰者模式
装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
package cn.juwatech.decorator;
abstract class Beverage {
String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}
class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
public double cost() {
return 1.99;
}
}
abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
public double cost() {
return .20 + beverage.cost();
}
}
public class DecoratorPatternDemo {
public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + " $" + beverage.cost());
beverage = new Mocha(beverage);
System.out.println(beverage.getDescription() + " $" + beverage.cost());
}
}
四、工厂模式
工厂模式通过定义一个创建对象的接口,让子类决定实例化哪一个类。
package cn.juwatech.factory;
abstract class Pizza {
String name;
void prepare() {
System.out.println("Preparing " + name);
}
void bake() {
System.out.println("Baking " + name);
}
void cut() {
System.out.println("Cutting " + name);
}
void box() {
System.out.println("Boxing " + name);
}
public String getName() {
return name;
}
}
class CheesePizza extends Pizza {
public CheesePizza() {
name = "Cheese Pizza";
}
}
class GreekPizza extends Pizza {
public GreekPizza() {
name = "Greek Pizza";
}
}
abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(String type);
}
class SimplePizzaFactory extends PizzaStore {
protected Pizza createPizza(String type) {
Pizza pizza = null;
if (type.equals("cheese")) {
pizza = new CheesePizza();
} else if (type.equals("greek")) {
pizza = new GreekPizza();
}
return pizza;
}
}
public class FactoryPatternDemo {
public static void main(String[] args) {
PizzaStore store = new SimplePizzaFactory();
Pizza pizza = store.orderPizza("cheese");
System.out.println("Ordered a " + pizza.getName() + "\n");
pizza = store.orderPizza("greek");
System.out.println("Ordered a " + pizza.getName() + "\n");
}
}