📜  java的模式练习(1)

📅  最后修改于: 2023-12-03 15:02:05.713000             🧑  作者: Mango

Java的设计模式练习

设计模式是一种被广泛应用于软件开发中的解决问题的方法。Java作为一种流行的编程语言,自然也有许多设计模式供开发人员使用。本文将介绍一些常见的Java设计模式以及如何在练习中应用它们。

单例模式

单例模式是一种常用的模式,通常用于确保系统中只存在一个实例,并且这个实例可以被全局访问。

示例代码
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
练习
  1. 创建一个单例模式的类,并在其中添加一个成员变量来保存一个计数器。实现一个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() );
    }
}
练习
  1. 创建一个主题类,并在其中添加一个成员变量保存一个整数。实现getStatesetState方法来访问和更新整数值。添加一个attach方法和一个notifyAllObservers方法来注册和通知观察者。观察者应该能够获取更新的整数并将其打印出来。

  2. 使用两个观察者类BinaryObserverHexaObserver,在主题值更改时分别打印整数的二进制和十六进制表示。

工厂模式

工厂模式是一种常用的模式,主要用于创建对象而不是直接使用构造函数。

示例代码
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;
    }
}
练习
  1. 创建一个接口Animal并在其中添加一个say方法。
  2. 创建两个实现类,分别为CatDog,并实现say方法。
  3. 创建一个工厂类AnimalFactory,该类应该提供一个getAnimal方法,根据传递的参数返回CatDog对象。
  4. 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);
    }
}
练习
  1. 创建一个接口PaymentStrategy,并在其中添加一个pay方法。该方法应该接受一个double类型的参数,表示支付的金额。
  2. 创建两个实现类,分别为CreditCardStrategyPaypalStrategy,并实现pay方法。
  3. 创建一个类Cart,在其中添加一个成员属性items,用于存储购物车中的物品,该属性可以使用任何适合存储多个字符串的数据结构。在该类中添加一个add方法,用于将项目添加到购物车中。
  4. Cart类中添加一个成员方法calculateTotal,用于计算购物车中所有项目的总价。该方法应该接受一个参数PaymentStrategy,用于指定客户端提供的支付策略。
  5. main方法中创建一个Cart对象,并添加一些项目。将CreditCardStrategy传递给calculateTotal方法,并打印总价。然后使用PaypalStrategy重复该操作以打印另一个总价。