📅  最后修改于: 2023-12-03 15:02:05.713000             🧑  作者: Mango
设计模式是一种被广泛应用于软件开发中的解决问题的方法。Java作为一种流行的编程语言,自然也有许多设计模式供开发人员使用。本文将介绍一些常见的Java设计模式以及如何在练习中应用它们。
单例模式是一种常用的模式,通常用于确保系统中只存在一个实例,并且这个实例可以被全局访问。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
count
方法,每次调用都会递增计数器并返回新的计数器值。观察者模式是一种常用的模式,主要用于监听对象的状态变化并通知观察者。
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer){
observers.add(observer);
}
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Binary String: " + Integer.toBinaryString( subject.getState() ) );
}
}
public class HexaObserver extends Observer{
public HexaObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Hex String: " + Integer.toHexString( subject.getState() ).toUpperCase() );
}
}
创建一个主题类,并在其中添加一个成员变量保存一个整数。实现getState
和setState
方法来访问和更新整数值。添加一个attach
方法和一个notifyAllObservers
方法来注册和通知观察者。观察者应该能够获取更新的整数并将其打印出来。
使用两个观察者类BinaryObserver
和HexaObserver
,在主题值更改时分别打印整数的二进制和十六进制表示。
工厂模式是一种常用的模式,主要用于创建对象而不是直接使用构造函数。
public interface Shape {
void draw();
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
public class ShapeFactory {
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
Animal
并在其中添加一个say
方法。Cat
和Dog
,并实现say
方法。AnimalFactory
,该类应该提供一个getAnimal
方法,根据传递的参数返回Cat
或Dog
对象。main
方法中使用AnimalFactory
创建一个Cat
对象和一个Dog
对象,然后调用它们的say
方法。策略模式是一种常用的模式,主要用于根据运行时情况选择不同的算法或行为。
public interface Strategy {
public int doOperation(int num1, int num2);
}
public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
public class OperationSubstract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
PaymentStrategy
,并在其中添加一个pay
方法。该方法应该接受一个double
类型的参数,表示支付的金额。CreditCardStrategy
和PaypalStrategy
,并实现pay
方法。Cart
,在其中添加一个成员属性items
,用于存储购物车中的物品,该属性可以使用任何适合存储多个字符串的数据结构。在该类中添加一个add
方法,用于将项目添加到购物车中。Cart
类中添加一个成员方法calculateTotal
,用于计算购物车中所有项目的总价。该方法应该接受一个参数PaymentStrategy
,用于指定客户端提供的支付策略。main
方法中创建一个Cart
对象,并添加一些项目。将CreditCardStrategy
传递给calculateTotal
方法,并打印总价。然后使用PaypalStrategy
重复该操作以打印另一个总价。