• 设计模式代码


    参考地址:https://www.runoob.com/design-pattern/design-pattern-tutorial.html

    工厂模式

    package com.up.designpatterns.factory;
    
    /**
     * @description: 工厂模式
     * @author: huilong.ding
     * @date: 2024/03/28 16:36
     **/
    public class factory {
        public static void main(String[] args) {
            ShapeFactory shapeFactory = new ShapeFactory();
    
            //获取 Circle 的对象,并调用它的 draw 方法
            Shape shape1 = shapeFactory.getShape("CIRCLE");
    
            //调用 Circle 的 draw 方法
            shape1.draw();
    
            //获取 Rectangle 的对象,并调用它的 draw 方法
            Shape shape2 = shapeFactory.getShape("RECTANGLE");
    
            //调用 Rectangle 的 draw 方法
            shape2.draw();
    
            //获取 Square 的对象,并调用它的 draw 方法
            Shape shape3 = shapeFactory.getShape("SQUARE");
    
            //调用 Square 的 draw 方法
            shape3.draw();
        }
    
    }
    
    interface Shape {
        void draw();
    }
    
    class Rectangle implements Shape {
    
        @Override
        public void draw() {
            System.out.println("Inside Rectangle::draw() method.");
        }
    }
    
    class Square implements Shape {
    
        @Override
        public void draw() {
            System.out.println("Inside Square::draw() method.");
        }
    }
    
    class Circle implements Shape {
    
        @Override
        public void draw() {
            System.out.println("Inside Circle::draw() method.");
        }
    }
    
    class ShapeFactory {
    
        //使用 getShape 方法获取形状类型的对象
        public Shape getShape(String shapeType){
            if(shapeType == null){
                return null;
            }
            if(shapeType.equalsIgnoreCase("CIRCLE")){
                return new Circle();
            } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
                return new Rectangle();
            } else if(shapeType.equalsIgnoreCase("SQUARE")){
                return new Square();
            }
            return null;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    抽象工厂模式

    package com.up.designpatterns.abstractfactory;
    
    /**
     * @description: 抽象工厂
     * @author: huilong.ding
     * @date: 2024/03/28 17:02
     **/
    public class AbstractFactoryDemo {
    }
    
    /*为形状创建一个接口。*/
    
    interface Shape {
        void draw();
    }
    //draw步骤 2
    //        创建实现接口的实体类。
    //
    //        Rectangle.java
    //
    //        Rectangle.java
    class Rectangle implements Shape {
    
        @Override
        public void draw() {
            System.out.println("Inside Rectangle::draw() method.");
        }
    }
    
    class Square implements Shape {
    
        @Override
        public void draw() {
            System.out.println("Inside Square::draw() method.");
        }
    }
    
    class Circle implements Shape {
    
        @Override
        public void draw() {
            System.out.println("Inside Circle::draw() method.");
        }
    }
    //步骤 3
    //        为颜色创建一个接口。
    //
    //        Color.java
    interface Color {
        void fill();
    }
    //步骤4
    //        创建实现接口的实体类。
    //
    //        Red.java
    class Red implements Color {
    
        @Override
        public void fill() {
            System.out.println("Inside Red::fill() method.");
        }
    }
    
    class Green implements Color {
    
        @Override
        public void fill() {
            System.out.println("Inside Green::fill() method.");
        }
    }
    
    class Blue implements Color {
    
        @Override
        public void fill() {
            System.out.println("Inside Blue::fill() method.");
        }
    }
    //步骤 5
    //        为 Color 和 Shape 对象创建抽象类来获取工厂。
    //
    //        AbstractFactory.java
    abstract class AbstractFactory {
        public abstract Color getColor(String color);
        public abstract Shape getShape(String shape);
    }
    //步骤 6
    //        创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。
    //
    //        ShapeFactory.java
    class ShapeFactory extends AbstractFactory {
    
        @Override
        public Shape getShape(String shapeType){
            if(shapeType == null){
                return null;
            }
            if(shapeType.equalsIgnoreCase("CIRCLE")){
                return new Circle();
            } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
                return new Rectangle();
            } else if(shapeType.equalsIgnoreCase("SQUARE")){
                return new Square();
            }
            return null;
        }
    
        @Override
        public Color getColor(String color) {
            return null;
        }
    }
    
    class ColorFactory extends AbstractFactory {
    
        @Override
        public Shape getShape(String shapeType){
            return null;
        }
    
        @Override
        public Color getColor(String color) {
            if(color == null){
                return null;
            }
            if(color.equalsIgnoreCase("RED")){
                return new Red();
            } else if(color.equalsIgnoreCase("GREEN")){
                return new Green();
            } else if(color.equalsIgnoreCase("BLUE")){
                return new Blue();
            }
            return null;
        }
    }
    //步骤 7
    //        创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。
    //
    //        FactoryProducer.java
    class FactoryProducer {
        public static AbstractFactory getFactory(String choice){
            if(choice.equalsIgnoreCase("SHAPE")){
                return new ShapeFactory();
            } else if(choice.equalsIgnoreCase("COLOR")){
                return new ColorFactory();
            }
            return null;
        }
    }
    //步骤 8
    //        使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象。
    //
    //        AbstractFactoryPatternDemo.java
    class AbstractFactoryPatternDemo {
        public static void main(String[] args) {
    
            //获取形状工厂
            AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
    
            //获取形状为 Circle 的对象
            Shape shape1 = shapeFactory.getShape("CIRCLE");
    
            //调用 Circle 的 draw 方法
            shape1.draw();
    
            //获取形状为 Rectangle 的对象
            Shape shape2 = shapeFactory.getShape("RECTANGLE");
    
            //调用 Rectangle 的 draw 方法
            shape2.draw();
    
            //获取形状为 Square 的对象
            Shape shape3 = shapeFactory.getShape("SQUARE");
    
            //调用 Square 的 draw 方法
            shape3.draw();
    
            //获取颜色工厂
            AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
    
            //获取颜色为 Red 的对象
            Color color1 = colorFactory.getColor("RED");
    
            //调用 Red 的 fill 方法
            color1.fill();
    
            //获取颜色为 Green 的对象
            Color color2 = colorFactory.getColor("GREEN");
    
            //调用 Green 的 fill 方法
            color2.fill();
    
            //获取颜色为 Blue 的对象
            Color color3 = colorFactory.getColor("BLUE");
    
            //调用 Blue 的 fill 方法
            color3.fill();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199

    策略模式

    package com.up.designpatterns.strategy;
    
    /**
     * @description: 策略模式
     * @author: huilong.ding
     * @date: 2024/03/28 14:42
     **/
    public class StrategyPatternDemo {
        public static void main(String[] args) {
    
            // 加法;
            System.out.println(new Context(new OperationAdd()).executeStrategy(5, 6));
    
            // 减法;
            System.out.println(new Context(new OperationSubtract()).executeStrategy(5, 6));
        }
    }
    
    interface Strategy {
        public int doOperation(int num1, int num2);
    }
    
    class OperationAdd implements Strategy{
    
        @Override
        public int doOperation(int num1, int num2) {
            return num1 + num2;
        }
    }
    
    class OperationSubtract 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 this.strategy.doOperation(num1, num2);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    观察者模式

    package com.up.designpatterns.observer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @description: 观察者模式
     * @author: huilong.ding
     * @date: 2024/03/28 11:57
     **/
    
    public class ObserverDemo{
        public static void main(String[] args) {
    
            // 使用观察者模式循环打印a,b,c各10次;
            Subject subject = new Subject();
    
            new OneObserver(subject);
            new TwoObserver(subject);
            new ThreeObserver(subject);
    
            for (int i = 0; i < 10; i++) {
                subject.setState(i+1);
            }
    
        }
    
    }
    
    class Subject {
    
        protected List<Observer> observers =
                new ArrayList<>();
    
        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();
            }
        }
    }
    
    abstract class Observer {
        protected Subject subject;
        public abstract void update();
    }
    
    class OneObserver extends Observer {
    
        public OneObserver(Subject subject) {
            this.subject = subject;
            this.subject.attach(this);
    
        }
    
        @Override
        public void update() {
            System.out.println("a + " + this.subject.getState());
        }
    }
    
    class TwoObserver extends Observer {
    
        public TwoObserver(Subject subject) {
            this.subject = subject;
            this.subject.attach(this);
    
        }
    
        @Override
        public void update() {
            System.out.println("b + " + this.subject.getState());
        }
    }
    
    class ThreeObserver extends Observer {
    
        public ThreeObserver(Subject subject) {
            this.subject = subject;
            this.subject.attach(this);
    
        }
    
        @Override
        public void update() {
            System.out.println("c + " + this.subject.getState());
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104

    单例模式

    package com.up.designpatterns.singleton;
    
    /**
     * @description: 单例模式
     * @author: huilong.ding
     * @date: 2024/04/01 17:11
     **/
    public class singletonDemo {
    
        public static void main(String[] args) {
    
            //不合法的构造函数
            //编译时错误:构造函数 SingleObject() 是不可见的
            //SingleObject object = new SingleObject();
    
            //获取唯一可用的对象
            SingleObject object = SingleObject.getInstance();
    
            //显示消息
            object.showMessage();
    
        }
    
    }
    
    class SingleObject{
    
        //创建 SingleObject 的一个对象
        private static SingleObject instance = new SingleObject();
    
        //让构造函数为 private,这样该类就不会被实例化
        private SingleObject(){}
    
        //获取唯一可用的对象
        public static SingleObject getInstance(){
            return instance;
        }
    
        public void showMessage(){
            System.out.println("Hello World!");
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    建造者模式

    package com.up.designpatterns.builder;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @description: 建造者模式
     * @author: huilong.ding
     * @date: 2024/04/01 17:41
     **/
    //步骤 1
    //        创建一个表示食物条目和食物包装的接口。
    //
    //        Item.java
    interface Item {
        public String name();
        public Packing packing();
        public float price();
    }
    //Packing.java
     interface Packing {
        public String pack();
    }
    //步骤 2
    //        创建实现 Packing 接口的实体类。
    //
    //        Wrapper.java
     class Wrapper implements Packing {
    
        @Override
        public String pack() {
            return "Wrapper";
        }
    }
    //Bottle.java
     class Bottle implements Packing {
    
        @Override
        public String pack() {
            return "Bottle";
        }
    }
    //步骤 3
    //        创建实现 Item 接口的抽象类,该类提供了默认的功能。
    //
    //        Burger.java
     abstract class Burger implements Item {
    
        @Override
        public Packing packing() {
            return new Wrapper();
        }
    
        @Override
        public abstract float price();
    }
    //ColdDrink.java
     abstract class ColdDrink implements Item {
    
        @Override
        public Packing packing() {
            return new Bottle();
        }
    
        @Override
        public abstract float price();
    }
    //步骤 4
    //        创建扩展了 Burger 和 ColdDrink 的实体类。
    //
    //        VegBurger.java
     class VegBurger extends Burger {
    
        @Override
        public float price() {
            return 25.0f;
        }
    
        @Override
        public String name() {
            return "Veg Burger";
        }
    }
    //ChickenBurger.java
     class ChickenBurger extends Burger {
    
        @Override
        public float price() {
            return 50.5f;
        }
    
        @Override
        public String name() {
            return "Chicken Burger";
        }
    }
    //Coke.java
     class Coke extends ColdDrink {
    
        @Override
        public float price() {
            return 30.0f;
        }
    
        @Override
        public String name() {
            return "Coke";
        }
    }
    //Pepsi.java
     class Pepsi extends ColdDrink {
    
        @Override
        public float price() {
            return 35.0f;
        }
    
        @Override
        public String name() {
            return "Pepsi";
        }
    }
    //步骤 5
    //        创建一个 Meal 类,带有上面定义的 Item 对象。
    //
    //        Meal.java
    
    
     class Meal {
        private List<Item> items = new ArrayList<Item>();
    
        public void addItem(Item item){
            items.add(item);
        }
    
        public float getCost(){
            float cost = 0.0f;
            for (Item item : items) {
                cost += item.price();
            }
            return cost;
        }
    
        public void showItems(){
            for (Item item : items) {
                System.out.print("Item : "+item.name());
                System.out.print(", Packing : "+item.packing().pack());
                System.out.println(", Price : "+item.price());
            }
        }
    }
    //步骤 6
    //        创建一个 MealBuilder 类,实际的 builder 类负责创建 Meal 对象。
    //
    //        MealBuilder.java
     class MealBuilder {
    
        public Meal prepareVegMeal (){
            Meal meal = new Meal();
            meal.addItem(new VegBurger());
            meal.addItem(new Coke());
            return meal;
        }
    
        public Meal prepareNonVegMeal (){
            Meal meal = new Meal();
            meal.addItem(new ChickenBurger());
            meal.addItem(new Pepsi());
            return meal;
        }
    }
    //步骤 7
    //        BuiderPatternDemo 使用 MealBuilder 来演示建造者模式(Builder Pattern)。
    //
    //        BuilderPatternDemo.java
     class BuilderDemo {
        public static void main(String[] args) {
            MealBuilder mealBuilder = new MealBuilder();
    
            Meal vegMeal = mealBuilder.prepareVegMeal();
            System.out.println("Veg Meal");
            vegMeal.showItems();
            System.out.println("Total Cost: " +vegMeal.getCost());
    
            Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
            System.out.println("\n\nNon-Veg Meal");
            nonVegMeal.showItems();
            System.out.println("Total Cost: " +nonVegMeal.getCost());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191

    适配器模式

    package com.up.designpatterns.adapter;
    
    /**
     * @description: 适配器模式
     * @author: huilong.ding
     * @date: 2024/04/01 20:07
     **/
    //步骤 1
    //        为媒体播放器和更高级的媒体播放器创建接口。
    //
    //        MediaPlayer.java
     interface MediaPlayer {
        public void play(String audioType, String fileName);
    }
    //AdvancedMediaPlayer.java
     interface AdvancedMediaPlayer {
        public void playVlc(String fileName);
        public void playMp4(String fileName);
    }
    //步骤 2
    //        创建实现了 AdvancedMediaPlayer 接口的实体类。
    //
    //        VlcPlayer.java
     class VlcPlayer implements AdvancedMediaPlayer{
        @Override
        public void playVlc(String fileName) {
            System.out.println("Playing vlc file. Name: "+ fileName);
        }
    
        @Override
        public void playMp4(String fileName) {
            //什么也不做
        }
    }
    //Mp4Player.java
     class Mp4Player implements AdvancedMediaPlayer{
    
        @Override
        public void playVlc(String fileName) {
            //什么也不做
        }
    
        @Override
        public void playMp4(String fileName) {
            System.out.println("Playing mp4 file. Name: "+ fileName);
        }
    }
    //步骤 3
    //        创建实现了 MediaPlayer 接口的适配器类。
    //
    //        MediaAdapter.java
     class MediaAdapter implements MediaPlayer {
    
        AdvancedMediaPlayer advancedMusicPlayer;
    
        public MediaAdapter(String audioType){
            if(audioType.equalsIgnoreCase("vlc") ){
                advancedMusicPlayer = new VlcPlayer();
            } else if (audioType.equalsIgnoreCase("mp4")){
                advancedMusicPlayer = new Mp4Player();
            }
        }
    
        @Override
        public void play(String audioType, String fileName) {
            if(audioType.equalsIgnoreCase("vlc")){
                advancedMusicPlayer.playVlc(fileName);
            }else if(audioType.equalsIgnoreCase("mp4")){
                advancedMusicPlayer.playMp4(fileName);
            }
        }
    }
    //步骤 4
    //        创建实现了 MediaPlayer 接口的实体类。
    //
    //        AudioPlayer.java
     class AudioPlayer implements MediaPlayer {
        MediaAdapter mediaAdapter;
    
        @Override
        public void play(String audioType, String fileName) {
    
            //播放 mp3 音乐文件的内置支持
            if(audioType.equalsIgnoreCase("mp3")){
                System.out.println("Playing mp3 file. Name: "+ fileName);
            }
            //mediaAdapter 提供了播放其他文件格式的支持
            else if(audioType.equalsIgnoreCase("vlc")
                    || audioType.equalsIgnoreCase("mp4")){
                mediaAdapter = new MediaAdapter(audioType);
                mediaAdapter.play(audioType, fileName);
            }
            else{
                System.out.println("Invalid media. "+
                        audioType + " format not supported");
            }
        }
    }
    //步骤 5
    //        使用 AudioPlayer 来播放不同类型的音频格式。
    //
    //        AdapterPatternDemo.java
    public class AdapterPatternDemo {
        public static void main(String[] args) {
            AudioPlayer audioPlayer = new AudioPlayer();
    
            audioPlayer.play("mp3", "beyond the horizon.mp3");
            audioPlayer.play("mp4", "alone.mp4");
            audioPlayer.play("vlc", "far far away.vlc");
            audioPlayer.play("avi", "mind me.avi");
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114

    责任链模式

    package com.up.designpatterns.chain;
    
    /**
     * @description: 责任链模式
     * @author: huilong.ding
     * @date: 2024/04/01 20:24
     **/
    //步骤 1
    //        创建抽象的记录器类。
    
     abstract class AbstractLogger {
        public static int INFO = 1;
        public static int DEBUG = 2;
        public static int ERROR = 3;
    
        protected int level;
    
        //责任链中的下一个元素
        protected AbstractLogger nextLogger;
    
        public void setNextLogger(AbstractLogger nextLogger){
            this.nextLogger = nextLogger;
        }
    
        public void logMessage(int level, String message){
            if(this.level <= level){
                write(message);
            }
            if(nextLogger !=null){
                nextLogger.logMessage(level, message);
            }
        }
    
        abstract protected void write(String message);
    
    }
    //步骤 2
    //        创建扩展了该记录器类的实体类。
    
     class ConsoleLogger extends AbstractLogger {
    
        public ConsoleLogger(int level){
            this.level = level;
        }
    
        @Override
        protected void write(String message) {
            System.out.println("Standard Console::Logger: " + message);
        }
    }
    
     class ErrorLogger extends AbstractLogger {
    
        public ErrorLogger(int level){
            this.level = level;
        }
    
        @Override
        protected void write(String message) {
            System.out.println("Error Console::Logger: " + message);
        }
    }
    
     class FileLogger extends AbstractLogger {
    
        public FileLogger(int level){
            this.level = level;
        }
    
        @Override
        protected void write(String message) {
            System.out.println("File::Logger: " + message);
        }
    }
    //步骤 3
    //        创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。
    //
    //        ChainPatternDemo.java
    public class ChainPatternDemo {
    
        private static AbstractLogger getChainOfLoggers(){
    
            AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
            AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
            AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
    
            errorLogger.setNextLogger(fileLogger);
            fileLogger.setNextLogger(consoleLogger);
    
            return errorLogger;
        }
    
        public static void main(String[] args) {
            AbstractLogger loggerChain = getChainOfLoggers();
    
            loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");
    
            loggerChain.logMessage(AbstractLogger.DEBUG,
                    "This is a debug level information.");
    
            loggerChain.logMessage(AbstractLogger.ERROR,
                    "This is an error information.");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104

    过滤器模式/标准模式

    package com.up.designpatterns.criteriapattern;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @description: 过滤器模式/标准模式
     * @author: huilong.ding
     * @date: 2024/04/01 17:52
     **/
    //步骤 1
    //        创建一个类,在该类上应用标准。
    
     class Person {
    
        private String name;
        private String gender;
        private String maritalStatus;
    
        public Person(String name,String gender,String maritalStatus){
            this.name = name;
            this.gender = gender;
            this.maritalStatus = maritalStatus;
        }
    
        public String getName() {
            return name;
        }
        public String getGender() {
            return gender;
        }
        public String getMaritalStatus() {
            return maritalStatus;
        }
    }
    //步骤 2
    //        为标准(Criteria)创建一个接口。
    
     interface Criteria {
        public List<Person> meetCriteria(List<Person> persons);
    }
    //步骤 3
    //        创建实现了 Criteria 接口的实体类。
    
    
     class CriteriaMale implements Criteria {
    
        @Override
        public List<Person> meetCriteria(List<Person> persons) {
            List<Person> malePersons = new ArrayList<Person>();
            for (Person person : persons) {
                if(person.getGender().equalsIgnoreCase("MALE")){
                    malePersons.add(person);
                }
            }
            return malePersons;
        }
    }
    
    
     class CriteriaFemale implements Criteria {
    
        @Override
        public List<Person> meetCriteria(List<Person> persons) {
            List<Person> femalePersons = new ArrayList<Person>();
            for (Person person : persons) {
                if(person.getGender().equalsIgnoreCase("FEMALE")){
                    femalePersons.add(person);
                }
            }
            return femalePersons;
        }
    }
    
     class CriteriaSingle implements Criteria {
    
        @Override
        public List<Person> meetCriteria(List<Person> persons) {
            List<Person> singlePersons = new ArrayList<Person>();
            for (Person person : persons) {
                if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){
                    singlePersons.add(person);
                }
            }
            return singlePersons;
        }
    }
    //AndCriteria.java
    
     class AndCriteria implements Criteria {
    
        private Criteria criteria;
        private Criteria otherCriteria;
    
        public AndCriteria(Criteria criteria, Criteria otherCriteria) {
            this.criteria = criteria;
            this.otherCriteria = otherCriteria;
        }
    
        @Override
        public List<Person> meetCriteria(List<Person> persons) {
            List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);
            return otherCriteria.meetCriteria(firstCriteriaPersons);
        }
    }
    //OrCriteria.java
    //        import java.util.List;
    
     class OrCriteria implements Criteria {
    
        private Criteria criteria;
        private Criteria otherCriteria;
    
        public OrCriteria(Criteria criteria, Criteria otherCriteria) {
            this.criteria = criteria;
            this.otherCriteria = otherCriteria;
        }
    
        @Override
        public List<Person> meetCriteria(List<Person> persons) {
            List<Person> firstCriteriaItems = criteria.meetCriteria(persons);
            List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);
    
            for (Person person : otherCriteriaItems) {
                if(!firstCriteriaItems.contains(person)){
                    firstCriteriaItems.add(person);
                }
            }
            return firstCriteriaItems;
        }
    }
    //步骤4
    //        使用不同的标准(Criteria)和它们的结合来过滤 Person 对象的列表。
    public class CriteriaPatternDemo {
        public static void main(String[] args) {
            List<Person> persons = new ArrayList<Person>();
    
            persons.add(new Person("Robert","Male", "Single"));
            persons.add(new Person("John","Male", "Married"));
            persons.add(new Person("Laura","Female", "Married"));
            persons.add(new Person("Diana","Female", "Single"));
            persons.add(new Person("Mike","Male", "Single"));
            persons.add(new Person("Bobby","Male", "Single"));
    
            Criteria male = new CriteriaMale();
            Criteria female = new CriteriaFemale();
            Criteria single = new CriteriaSingle();
            Criteria singleMale = new AndCriteria(single, male);
            Criteria singleOrFemale = new OrCriteria(single, female);
    
            System.out.println("Males: ");
            printPersons(male.meetCriteria(persons));
    
            System.out.println("\nFemales: ");
            printPersons(female.meetCriteria(persons));
    
            System.out.println("\nSingle Males: ");
            printPersons(singleMale.meetCriteria(persons));
    
            System.out.println("\nSingle Or Females: ");
            printPersons(singleOrFemale.meetCriteria(persons));
        }
    
        public static void printPersons(List<Person> persons){
            for (Person person : persons) {
                System.out.println("Person : [ Name : " + person.getName()
                        +", Gender : " + person.getGender()
                        +", Marital Status : " + person.getMaritalStatus()
                        +" ]");
            }
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
  • 相关阅读:
    数据结构与算法知识点总结(4)各类排序算法
    【Linux】JumpServer 堡垒机远程访问
    AI全栈大模型工程师(七)内容审核
    Linux进程优先级与环境变量初识
    了解 IPv4 和 IPv6 之间的区别?
    学习:原码-反码-补码
    node socket.io
    npm 安装第三方字体库
    操作系统学习笔记10 | I/O、显示器与键盘
    网上商城小程序(小程序+PHP)
  • 原文地址:https://blog.csdn.net/qq_45807943/article/details/137343952