类的适配器模式

首先,有两个类:ClassA、ClassB

ClassA类:有A、B两个方法

ClassB类:有B、C两个方法

那么,怎么做才能在实现了ClassA类之后,让ClassB类公用ClassA类的B方法

如下一个例子:

鸡子和鸭子都会飞,但是鸭子是”嘎嘎”叫,鸡子是”咯咯”叫,

那么怎么在创建了一个鸭子类之后,让鸡子类使用鸭子类中共同属性的方法呢?

1. 类适配器模式

    public static void main(String[] args) {
//        使用 Adapter 创建 Duck 对象
        Duck duck = new Adapter();
        duck.fly();         // 鸭子 飞 的方法
        duck.quack();       // 鸭子 嘎嘎 的方法
        System.out.println("----------------------");
//        使用 Adapter 创建 Chicken 对象
        Chicken chicken = new Adapter();
        chicken.fly();      // 鸡子 飞 的方法
        chicken.gobble();   // 鸡子 咯咯 的方法
        System.out.println("----------------------");
//        使用 Adapter 创建 Bird 对象
        Bird bird = new Adapter();
        bird.fly();         // 小鸟 飞 的方法
        bird.chirp();       // 小鸟 叽叽 的方法
    }


    public interface Duck {
        void fly();
        void quack();
    }

    public interface Chicken {
        void fly();
        void gobble();
    }

    public interface Bird {
        void fly();
        void chirp();
    }

    public static class Ducker implements Duck {
        @Override
        public void fly() {
            System.out.println("我会飞 我会飞");
        }
        @Override
        public void quack() {
            System.out.println("Duck 嘎嘎 嘎嘎");
        }
    }

    public static class Adapter extends Ducker implements Chicken, Bird {
        @Override
        public void gobble() {
            System.out.println("Chicken 咯咯 咯咯");
        }

        @Override
        public void chirp() {
            System.out.println("Bird 叽叽 叽叽");
        }
    }

打印结果为

我会飞 我会飞
Duck 嘎嘎 嘎嘎
----------------------
我会飞 我会飞
Chicken 咯咯 咯咯
----------------------
我会飞 我会飞
Bird 叽叽 叽叽

2. 对象适配器模式

ChickenBird想用Duckfly()方法,则看下面的例子

    public static void main(String[] args) {
//        使用 Adapter 创建 Chicken 对象
//        需要传入 Duck 的对象, 才能使用 Duck 中的 fly 方法
        Chicken chicken = new Adapter(new Ducker());
        chicken.fly();
        chicken.gobble();
        System.out.println("-----------------");

//        使用 Adapter 创建 Chicken 对象
//        需要传入 Duck 的对象, 才能使用 Duck 中的 fly 方法
        Bird bird = new Adapter(new Ducker());
        bird.fly();
        bird.chirp();
        System.out.println("-----------------");

//        使用自己的类创建对象
        Duck duck = new Ducker();
        duck.fly();
        duck.quack();
    }


    public interface Duck {
        void fly();
        void quack();
    }

    public interface Chicken {
        void fly();
        void gobble();
    }

    public interface Bird {
        void fly();
        void chirp();
    }

    public static class Ducker implements Duck {
        @Override
        public void fly() {
            System.out.println("我会飞 我会飞");
        }
        @Override
        public void quack() {
            System.out.println("Duck 嘎嘎 嘎嘎");
        }
    }


    public static class Adapter implements Chicken, Bird {
        Ducker ducker;

        public Adapter(Ducker ducker) {
            super();
            this.ducker = ducker;
        }

        @Override
        public void fly() {
            ducker.fly();
        }

        @Override
        public void chirp() {
            System.out.println("Bird 叽叽 叽叽");
        }


        @Override
        public void gobble() {
            System.out.println("Chicken 咯咯 咯咯");
        }
    }

运行结果:

我会飞 我会飞
Chicken 咯咯 咯咯
-----------------
我会飞 我会飞
Bird 叽叽 叽叽
-----------------
我会飞 我会飞
Duck 嘎嘎 嘎嘎

发表评论

电子邮件地址不会被公开。 必填项已用*标注