原型,模板,策略,适配器模式

原型模式

原型模式(创建型模式),核心思想就是:基于一个已有的对象复制一个对象出来,通过复制来减少对象的直接创建的成本。
总结一下,原型模式的两种方法,浅拷贝只会复制对象里面的基本数据类型和引用对象的内存地址,不会递归地复制引用对象,以及引用对象的引用对象。而深拷贝就是会完全拷贝一个新的对象出来。所以,深拷贝的操作会比浅拷贝更加耗时,性能更差一点。同时浅拷贝的代码写起来也比深拷贝的代码写起来更简单一点。如果咱们拷贝的对象是不可变的,也就是说我这个对象只会查看,不会增删改,那么,直接用浅拷贝就好了,如果拷贝的对象存在增删改的情况,那么就需要使用深拷贝了。总而言之,就是要深浅得当,根据项目实际情况而定。
代码举例

// 原型接口
interface Shape extends Cloneable {
    void draw();
    Shape clone();
}

// 具体原型类 - 圆形
class Circle implements Shape {
    private String color;

    public Circle(String color) {
        this.color = color;
    }

    @Override
    public void draw() {
        System.out.println("Drawing a circle with color: " + color);
    }

    @Override
    public Shape clone() {
        return new Circle(color);
    }
}

// 具体原型类 - 正方形
class Square implements Shape {
    private String color;

    public Square(String color) {
        this.color = color;
    }

    @Override
    public void draw() {
        System.out.println("Drawing a square with color: " + color);
    }

    @Override
    public Shape clone() {
        return new Square(color);
    }
}

// 原型管理器
class ShapeCache {
    private static Map<String, Shape> shapeMap = new HashMap<>();

    public static Shape getShape(String type) {
        Shape cachedShape = shapeMap.get(type);
        return (Shape) cachedShape.clone();
    }

    public static void loadCache() {
        Circle circle = new Circle("red");
        shapeMap.put("circle", circle);

        Square square = new Square("blue");
        shapeMap.put("square", square);
    }
}

// 示例使用
public class PrototypePatternExample {
    public static void main(String[] args) {
        ShapeCache.loadCache();

        Shape clonedShape1 = ShapeCache.getShape("circle");
        clonedShape1.draw();  // 输出: Drawing a circle with color: red

        Shape clonedShape2 = ShapeCache.getShape("square");
        clonedShape2.draw();  // 输出: Drawing a square with color: blue
    }
}

模板模式

模板方法模式也非常简单,但是,他却是比较重要的,在很多开源框架里面都用到了这个模式,并且,我们在做项目的时候,也会经常用到这个模式。这个模板方法模式,简单来说就是一句话:在父类中定义业务处理流程的框架,到子类中去做具体的实现。

代码举例

// 抽象模板类
abstract class Game {
    abstract void initialize();
    abstract void startPlay();
    abstract void endPlay();

    // 模板方法,定义算法框架
    public final void play() {
        initialize();
        startPlay();
        endPlay();
    }
}

// 具体模板类 - 足球游戏
class FootballGame extends Game {
    @Override
    void initialize() {
        System.out.println("Football Game Initialized! Start playing.");
    }

    @Override
    void startPlay() {
        System.out.println("Playing football...");
    }

    @Override
    void endPlay() {
        System.out.println("Football Game Finished!");
    }
}

// 具体模板类 - 篮球游戏
class BasketballGame extends Game {
    @Override
    void initialize() {
        System.out.println("Basketball Game Initialized! Start playing.");
    }

    @Override
    void startPlay() {
        System.out.println("Playing basketball...");
    }

    @Override
    void endPlay() {
        System.out.println("Basketball Game Finished!");
    }
}

// 示例使用
public class TemplatePatternExample {
    public static void main(String[] args) {
        Game footballGame = new FootballGame();
        footballGame.play();
        // 输出:
        // Football Game Initialized! Start playing.
        // Playing football...
        // Football Game Finished!

        System.out.println();

        Game basketballGame = new BasketballGame();
        basketballGame.play();
        // 输出:
        // Basketball Game Initialized! Start playing.
        // Playing basketball...
        // Basketball Game Finished!
    }
}

策略模式

接着我们来看一下策略模式,策略模式呢也是非常简单,他就是定义一个主要的接口,然后很多个类去实现这个接口,比如说我们定义一个文件上传的接口,然后阿里云的上传类去实现它,腾讯云的上传类也去实现它,这样因为都是实现的同一个接口,所以上传类之间是可以在代码中互相替换的。

代码举例

// 策略接口
interface Strategy {
    int doOperation(int num1, int num2);
}

// 具体策略类 - 加法
class AddStrategy implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

// 具体策略类 - 减法
class SubtractStrategy implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

// 上下文类
class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }
}

// 示例使用
public class StrategyPatternExample {
    public static void main(String[] args) {
        Context context = new Context(new AddStrategy());
        int result1 = context.executeStrategy(10, 5);
        System.out.println("10 + 5 = " + result1);  // 输出: 10 + 5 = 15

        context = new Context(new SubtractStrategy());
        int result2 = context.executeStrategy(10, 5);
        System.out.println("10 - 5 = " + result2);  // 输出: 10 - 5 = 5
    }
}

委派模式

委派模式(Delegate Pattern)又叫委托模式,是一种面向对象的设计模式,基本作用就是负责任务的调用和分配;是一种特殊的静态代理,可以理解为全权代理(代理模式注重过程,而委派模式注重结果),委派模式属于行为型模式,不属于GOF23种设计模式;

代码举例

// 委派接口
interface Printer {
    void print();
}

// 具体委派类 - 打印机A
class PrinterA implements Printer {
    @Override
    public void print() {
        System.out.println("Printer A is printing.");
    }
}

// 具体委派类 - 打印机B
class PrinterB implements Printer {
    @Override
    public void print() {
        System.out.println("Printer B is printing.");
    }
}

// 委派类
class PrinterManager {
    private Printer printer;

    public void setPrinter(Printer printer) {
        this.printer = printer;
    }

    public void print() {
        printer.print();
    }
}

// 示例使用
public class DelegatePatternExample {
    public static void main(String[] args) {
        PrinterManager printerManager = new PrinterManager();

        // 使用打印机A
        PrinterA printerA = new PrinterA();
        printerManager.setPrinter(printerA);
        printerManager.print();  // 输出: Printer A is printing.

        System.out.println();

        // 使用打印机B
        PrinterB printerB = new PrinterB();
        printerManager.setPrinter(printerB);
        printerManager.print();  // 输出: Printer B is printing.
    }
}

适配器模式

适配器模式也比较简单,核心思想就是是:将一个类的接口转换成客户希望的另一个接口,讲白了就是通过适配器可以将原本不匹配、不兼容的接口或类结合起来;

代码举例

// 目标接口
interface Target {
    void request();
}

// 适配者类
class Adaptee {
    public void specificRequest() {
        System.out.println("Specific request from Adaptee.");
    }
}

// 适配器类
class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// 示例使用
public class AdapterPatternExample {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target adapter = new Adapter(adaptee);

        adapter.request();  // 输出: Specific request from Adaptee.
    }
}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>