几个重要的设计模式
工廠方法
定義了一個創建對象的接口,但由子類決定要實例化哪個類。工廠方法把實例化操作推遲到子類。
public abstract class Factory {abstract public Product factoryMethod();public void doSomething() {Product product = factoryMethod();// do something with the product} } public class ConcreteFactory extends Factory {public Product factoryMethod() {return new ConcreteProduct();} } public class ConcreteFactory1 extends Factory {public Product factoryMethod() {return new ConcreteProduct1();} } public class ConcreteFactory2 extends Factory {public Product factoryMethod() {return new ConcreteProduct2();} }策略
定義一系列算法,封裝每個算法,并使它們可以互換。策略模式可以讓算法獨立于使用它的客戶端。
public interface QuackBehavior {void quack(); } public class Quack implements QuackBehavior {@Overridepublic void quack() {System.out.println("quack!");} } public class Squeak implements QuackBehavior{@Overridepublic void quack() {System.out.println("squeak!");} } public class Duck {private QuackBehavior quackBehavior;public void performQuack() {if (quackBehavior != null) {quackBehavior.quack();}}public void setQuackBehavior(QuackBehavior quackBehavior) {this.quackBehavior = quackBehavior;} } public class Client {public static void main(String[] args) {Duck duck = new Duck();duck.setQuackBehavior(new Squeak());duck.performQuack();duck.setQuackBehavior(new Quack());duck.performQuack();} }適配器模式
把一個類接口轉換成另一個用戶需要的接口。
public interface Duck {void quack(); } public interface Turkey {void gobble(); } public class WildTurkey implements Turkey {@Overridepublic void gobble() {System.out.println("gobble!");} } public class TurkeyAdapter implements Duck {Turkey turkey;public TurkeyAdapter(Turkey turkey) {this.turkey = turkey;}@Overridepublic void quack() {turkey.gobble();} } public class Client {public static void main(String[] args) {Turkey turkey = new WildTurkey();Duck duck = new TurkeyAdapter(turkey);duck.quack();} }包裝
設計不同種類的飲料,飲料可以添加配料,比如可以添加牛奶,并且支持動態添加新配料。每增加一種配料,該飲料的價格就會增加,要求計算一種飲料的價格。
public interface Beverage {double cost(); } public class DarkRoast implements Beverage {@Overridepublic double cost() {return 1;} } public class HouseBlend implements Beverage {@Overridepublic double cost() {return 1;} } public abstract class CondimentDecorator implements Beverage {protected Beverage beverage; } public class Milk extends CondimentDecorator {public Milk(Beverage beverage) {this.beverage = beverage;}@Overridepublic double cost() {return 1 + beverage.cost();} } public class Mocha extends CondimentDecorator {public Mocha(Beverage beverage) {this.beverage = beverage;}@Overridepublic double cost() {return 1 + beverage.cost();} } public class Client {public static void main(String[] args) {Beverage beverage = new HouseBlend();beverage = new Mocha(beverage);beverage = new Milk(beverage);System.out.println(beverage.cost());} }責任鏈??
使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈發送該請求,直到有一個對象處理它為止
public abstract class Handler {protected Handler successor;public Handler(Handler successor) {this.successor = successor;}protected abstract void handleRequest(Request request); } public class ConcreteHandler1 extends Handler {public ConcreteHandler1(Handler successor) {super(successor);}@Overrideprotected void handleRequest(Request request) {if (request.getType() == RequestType.TYPE1) {System.out.println(request.getName() + " is handle by ConcreteHandler1");return;}if (successor != null) {successor.handleRequest(request);}} } public class ConcreteHandler2 extends Handler {public ConcreteHandler2(Handler successor) {super(successor);}@Overrideprotected void handleRequest(Request request) {if (request.getType() == RequestType.TYPE2) {System.out.println(request.getName() + " is handle by ConcreteHandler2");return;}if (successor != null) {successor.handleRequest(request);}} } public class Request {private RequestType type;private String name;public Request(RequestType type, String name) {this.type = type;this.name = name;}public RequestType getType() {return type;}public String getName() {return name;} } public enum RequestType {TYPE1, TYPE2 } public class Client {public static void main(String[] args) {Handler handler1 = new ConcreteHandler1(null);Handler handler2 = new ConcreteHandler2(handler1);Request request1 = new Request(RequestType.TYPE1, "request1");handler2.handleRequest(request1);Request request2 = new Request(RequestType.TYPE2, "request2");handler2.handleRequest(request2);} } request1 is handle by ConcreteHandler1 request2 is handle by ConcreteHandler2觀察者
定義對象之間的一對多依賴,當一個對象狀態改變時,它的所有依賴都會收到通知并且自動更新狀態。主題(Subject)是被觀察的對象,而其所有依賴者(Observer)稱為觀察者。
public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObserver(); } public class WeatherData implements Subject {private List<Observer> observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList<>();}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;notifyObserver();}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {int i = observers.indexOf(o);if (i >= 0) {observers.remove(i);}}@Overridepublic void notifyObserver() {for (Observer o : observers) {o.update(temperature, humidity, pressure);}} } public interface Observer {void update(float temp, float humidity, float pressure); } public class StatisticsDisplay implements Observer {public StatisticsDisplay(Subject weatherData) {weatherData.reisterObserver(this);}@Overridepublic void update(float temp, float humidity, float pressure) {System.out.println("StatisticsDisplay.update: " + temp + " " + humidity + " " + pressure);} } public class CurrentConditionsDisplay implements Observer {public CurrentConditionsDisplay(Subject weatherData) {weatherData.registerObserver(this);}@Overridepublic void update(float temp, float humidity, float pressure) {System.out.println("CurrentConditionsDisplay.update: " + temp + " " + humidity + " " + pressure);} } public class WeatherStation {public static void main(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);weatherData.setMeasurements(0, 0, 0);weatherData.setMeasurements(1, 1, 1);} } CurrentConditionsDisplay.update: 0.0 0.0 0.0 StatisticsDisplay.update: 0.0 0.0 0.0 CurrentConditionsDisplay.update: 1.0 1.0 1.0 StatisticsDisplay.update: 1.0 1.0 1.0?
?
總結
- 上一篇: 哈希索引
- 下一篇: (17万浏览量) .NET Core的介