Узоры дизайна Java Combat, из всех вещей адаптер Mode Personify

Java задняя часть
Узоры дизайна Java Combat, из всех вещей адаптер Mode Personify
  • Большое спасибо за чтение этой статьи, добро пожаловать в 【👍Нравится】【⭐Коллекция】【📝Комментарий】~
  • Нетрудно сдаться, но должно быть здорово упорствовать! Надеюсь, что каждый день мы все будем становиться лучше! 🎉

Что такое режим адаптера

Ниже приводится объяснение из Википедии.

В компьютерном программировании шаблон адаптера (иногда называемый стилем оболочки или оболочкой) адаптирует интерфейс класса к тому, что ожидает пользователь. Адаптация позволяет классам, которые обычно не работают вместе из-за несовместимых интерфейсов, работать вместе, заключая собственный интерфейс класса в существующий класс.

Есть два типа режимов адаптера:

  • Уровень адаптера класса:

В этом режиме адаптер наследуется от реализованного класса (обычно множественное наследование).

  • Шаблон адаптера объекта:

В этом шаблоне адаптера адаптер содержит экземпляр класса, который он обертывает. В этом случае адаптер вызывает обернутый объект.

Шаблоны проектирования не имеют ничего общего с языками программирования, но вторые мастера по-прежнему используют язык Java для практических примеров.


Шаблон адаптера для классов

img

  • Роль источника (адапев): интерфейс, который должен быть адаптирован сейчас.
  • Целевая роль: это ожидаемый интерфейс. Примечание. Поскольку здесь обсуждается шаблон адаптера класса, цель не может быть классом.
  • Роль адаптера (Adaper): класс адаптера является ядром этого шаблона. Адаптер преобразует исходный интерфейс в целевой интерфейс. Очевидно, что эта роль не может быть интерфейсом, а должна быть конкретным классом.

Исходная (Adapee) роль

Второй хозяин любит собак, поэтому держит собаку, и она иногда лает.

package com.secondgod.adapter;

/**
 * 狗狗
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Dog {
    /**
     * 发出声音
     */
    public void makeSound() {
        System.out.println("狗狗:汪汪汪。。。。。。");
    }
}

Целевая роль

Мы будем говорить и болтать с друзьями.

package com.secondgod.adapter;

/**
 * 朋友
 * 
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public interface IFriend {
    /**
     * 说话
     */
    void speak();
}

Роль адаптера (адаптера)

Через некоторое время второй хозяин стал относиться к собаке как к другу и чувствовал, что она не лает, а разговаривает.

package com.secondgod.adapter;

/**
 * 狗狗朋友
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class DogFriend extends Dog implements IFriend {
    /**
     * 说话了
     */
    @Override
    public void speak() {
        super.makeSound();
    }
}

Давайте попробуем поговорить с другом-собакой.

package com.secondgod.adapter;

/**
 * 人
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Person {
    /**
     * 和朋友聊天
     *
     * @param friend
     */
    public void speakTo(IFriend friend) {
        System.out.println("人:朋友,你干什么呢?");
        friend.speak();
    }

    public static void main(String[] args) {
        Person  person = new Person();
        IFriend friend = new DogFriend();
        person.speakTo(friend);
    }
}

在这里插入图片描述

Второй хозяин что-то сказал, собака залаяла, и мы действительно как будто болтали.


Последствия добавления исходных (Adapee) ролей

Однажды второй хозяин вырастил еще одну кошку.

package com.secondgod.adapter;

/**
 * 猫猫
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Cat {
    /**
     * 发出声音
     */
    public void makeSound() {
        System.out.println("猫猫:喵喵喵。。。。。。");
    }
}

Через несколько дней второй и кошки тоже подружились. Я должен добавить кота в друзья.

package com.secondgod.adapter;

/**
 * 猫猫朋友
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class CatFriend extends Cat implements IFriend {
    /**
     * 说话了
     */
    @Override
    public void speak() {
        super.makeSound();
    }
}

Вторые головные чаты с друзьями и кошачьим друзьями.

package com.secondgod.adapter;

/**
 * 人
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Person {
    /**
     * 和朋友聊天
     *
     * @param friend
     */
    public void speakTo(IFriend friend) {
        System.out.println("人:朋友,你干什么呢?");
        friend.speak();
    }

    public static void main(String[] args) {
        Person  person = new Person();
        IFriend dogFriend = new DogFriend();
        IFriend catFriend = new CatFriend();
        person.speakTo(dogFriend);
        person.speakTo(catFriend);
    }
}

在这里插入图片描述

В будущем, если у второго хозяина появятся другие друзья-животные, ему нужно будет добавить классы-адаптеры. Есть ли способ быть более общим?


Шаблон адаптера объекта

№ 2 надеется, что появится способ подружиться с различными животными, вместо того, чтобы добавлять адаптер каждый раз, когда у вас появляется новый друг-животное.

在这里插入图片描述


Добавьте интерфейс с животными

package com.secondgod.adapter;

/**
 * 动物
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public interface IAnimal {

    /**
     * 发出声音
     */
    void makeSound();
}

Пусть кошки и собаки роли источника (Adapee) реализуют интерфейс животных

package com.secondgod.adapter;

/**
 * 狗狗
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Dog implements IAnimal {
    /**
     * 发出声音
     */
    public void makeSound() {
        System.out.println("狗狗:汪汪汪。。。。。。");
    }
}
package com.secondgod.adapter;

/**
 * 猫猫
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Cat implements IAnimal {
    /**
     * 发出声音
     */
    public void makeSound() {
        System.out.println("猫猫:喵喵喵。。。。。。");
    }
}

Роль Антропоморфный Адаптер (Адапер)

package com.secondgod.adapter;

/**
 * 万物拟人适配器
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class AnimalFriendAdaper implements IFriend {
    /**
     * 被拟人化的动物朋友
     */
    private IAnimal animal;

    public AnimalFriendAdaper(IAnimal animal) {
        this.animal = animal;
    }

    @Override
    public void speak() {
        animal.makeSound();
    }
}

Протестируйте наш антропоморфный адаптер.

package com.secondgod.adapter;

/**
 * 人
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Person {
    /**
     * 和朋友聊天
     *
     * @param friend
     */
    public void speakTo(IFriend friend) {
        System.out.println("人:朋友,你干什么呢?");
        friend.speak();
    }

    public static void main(String[] args) {
        // 一个人
        Person  person = new Person();
        // 一只狗
        IAnimal dog = new Dog();
        // 一只猫
        IAnimal cat = new Cat();
        // 万物拟人
        person.speakTo(new AnimalFriendAdaper(dog));
        person.speakTo(new AnimalFriendAdaper(cat));
    }
}

在这里插入图片描述

Очень хороший. Дружить с животными намного проще. Из-за антропоморфного адаптера всех вещей.


Режим адаптации по умолчанию

在这里插入图片描述


Целевая роль добавляет заявление о поведении

Однажды стандарты друзей изменились. Вы должны знать, как кодировать кирпичи.

package com.secondgod.adapter;

/**
 * 朋友
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public interface IFriend {
    /**
     * 说话
     */
    void speak();

    /**
     * 码起来
     */
    void coding();
}

Роль адаптера (Adaper) должна быть реализована вместе с добавленным поведением

Модифицированный антропоморфный адаптер для всех вещей

package com.secondgod.adapter;

/**
 * 万物拟人适配器
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class AnimalFriendAdaper implements IFriend {
    /**
     * 被拟人化的动物朋友
     */
    private IAnimal animal;

    public AnimalFriendAdaper(IAnimal animal) {
        this.animal = animal;
    }

    @Override
    public void speak() {
        animal.makeSound();
    }

    @Override
    public void coding() {
        System.out.println("动物:笑而不语摇摇头。。。。。。");
    }
}

адаптер по умолчанию

Второй босс хочет дружить с животными, но он не хочет думать о том, как они укладывают кирпичи.В будущем, если второй босс хочет дружить с растениями, он должен реализовать поведение укладки для друзей-растений, слишком. Итак, пусть у нас будет пустая реализация по умолчанию.

package com.secondgod.adapter;

/**
 * 缺省适配器
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public abstract class FriendAdaper implements IFriend {
    @Override
    public void speak() {

    }

    @Override
    public void coding() {

    }
}
package com.secondgod.adapter;

/**
 * 万物拟人适配器
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class AnimalFriendAdaper extends FriendAdaper {
    /**
     * 被拟人化的动物朋友
     */
    private IAnimal animal;

    public AnimalFriendAdaper(IAnimal animal) {
        this.animal = animal;
    }

    @Override
    public void speak() {
        animal.makeSound();
    }
}

С еще одной реализацией по умолчанию нам не нужно реализовывать поведение блока кода для адаптера Everything.

Шаблон адаптера предназначен для изменения интерфейса источника, чтобы интерфейс получателя был совместим. Назначение адаптера по умолчанию немного отличается, это тривиальная реализация, предназначенная для облегчения создания нетривиального класса адаптера.

В любое время, если вы не готовятся к всем методам интерфейса, вы можете использовать режим «Adapter по умолчанию» для создания абстрактного класса, дают конкретное внедрение посредственности всех методов. Таким образом, подкласс этого абстрактного класса не придется реализовать все методы.