设计模式:结构型设计模式(上)

目录

1.适配器模式

2.桥接模式

3.过滤器模式(标准模式)

4.组合模式


1.适配器模式

代码示例:

package designPattern;

/**
 * 适配器模式
 * 假设你的电脑只有一个Type-C接口,现在你想要将电脑接入网线和USB
 * 那么我们就可以使用一个适配器Adapter来作为这个不兼容接口之间的桥梁
 */
public class AdapterMode {
    public static void main(String[] args) {
        Adapter adapter = new Adapter();
        adapter.transmission("usb");
        adapter.transmission("network");
        //无法适配GVA信号
        adapter.transmission("GVA");
    }
}

/**
 * 网线接口
 */
interface NetworkInterface {
    void transmission();
}

/**
 * USB接口
 */
interface USBInterface {
    void transmission();
}

/**
 * 适配器接口
 */
interface AdapterInterface {
    /**
     * 适配不同的传输信号
     *
     * @param signalsName 信号名称
     */
    void transmission(String signalsName);
}

/**
 * NetworkInterface的实现类
 */
class Network implements NetworkInterface {
    @Override
    public void transmission() {
        System.out.println("i'm transmitting network signals");
    }
}

/**
 * USBInterface的实现类
 */
class USB implements USBInterface {
    @Override
    public void transmission() {
        System.out.println("i'm transmitting USB signals");
    }
}

/**
 * AdapterInterface的实现类
 */
class Adapter implements AdapterInterface {
    private Network network = new Network();
    private USB usb = new USB();

    @Override
    public void transmission(String signalsName) {
        if (signalsName.equalsIgnoreCase("network")) network.transmission();
        else if (signalsName.equalsIgnoreCase("usb")) usb.transmission();
        else System.out.println("signals error");
    }
}




2.桥接模式

 代码示例:

package designPattern;

/**
 * 桥接模式
 * 将具体类与接口实现者类分开,是它们都可以独立的变化
 */
public class BridgingMode {
    public static void main(String[] args) {
        Color black = new Black();
        Shape circle = new Circle();
        circle.setColor(black);
        circle.print();

    }
}

interface Color {
    void getColor();
}

/**
 * Color接口的三个实现类
 */
class White implements Color {
    @Override
    public void getColor() {
        System.out.println("i am a white");
    }
}

class Black implements Color {
    @Override
    public void getColor() {
        System.out.println("i am a black");
    }
}

class Blue implements Color {
    @Override
    public void getColor() {
        System.out.println("i am a blue");
    }
}

/**
 * Shape在此处充当接口实现类和具体类之间的一个桥梁
 */
abstract class Shape {
    Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    public abstract void print();
}

class Circle extends Shape {
    @Override
    public void print() {
        color.getColor();
        System.out.println("big Circle");
    }
}

class Rectangle extends Shape {
    @Override
    public void print() {
        color.getColor();
        System.out.println("big Rectangle");
    }
}

class Square extends Shape {
    @Override
    public void print() {
        color.getColor();
        System.out.println("big Square");
    }
}

3.过滤器模式(标准模式)

代码示例:

package designPattern;

import java.util.ArrayList;
import java.util.List;

/**
 * 过滤器模式(标准模式)
 */
public class FilterMode {
    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 Male();
        Criteria female = new Female();
        Criteria single = new Single();
        //单身男士过滤器
        Criteria singleMale = new AndCriteria(male, single);
        singleMale.meetCriteria(persons).forEach(System.out::println);
    }
}

/**
 * 人类
 */
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;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", maritalStatus='" + maritalStatus + '\'' +
                '}';
    }
}

/**
 * 标准接口
 */
interface Criteria {
    //返回符合标准的人集合
    public List<Person> meetCriteria(List<Person> persons);
}

/**
 * 根据女性这个标准来过滤对象
 */
class Male 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 Female 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 Single 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;
    }
}

/**
 * 两层过滤,要都满足才可通过
 */
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);
    }
}

/**
 * 两层过滤,满足至少有一项满足即可通过
 */
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.组合模式

package designPattern;

import java.util.ArrayList;
import java.util.List;

/**
 * 组合模式,模拟公司人员结构
 * 组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构
 */
public class CombinationMode {
    public static void main(String[] args) {
        Employee CEO = new Employee("John", "CEO", 30000);

        Employee headSales = new Employee("Robert", "Head Sales", 20000);

        Employee headMarketing = new Employee("Michel", "Head Marketing", 20000);

        Employee clerk1 = new Employee("Laura", "Marketing", 10000);
        Employee clerk2 = new Employee("Bob", "Marketing", 10000);

        Employee salesExecutive1 = new Employee("Richard", "Sales", 10000);
        Employee salesExecutive2 = new Employee("Rob", "Sales", 10000);

        CEO.add(headSales);
        CEO.add(headMarketing);

        headSales.add(salesExecutive1);
        headSales.add(salesExecutive2);

        headMarketing.add(clerk1);
        headMarketing.add(clerk2);

        //打印该组织的所有员工
        System.out.println(CEO);
        for (Employee headEmployee : CEO.getSubordinates()) {
            System.out.println(headEmployee);
            for (Employee employee : headEmployee.getSubordinates()) {
                System.out.println(employee);
            }
        }
    }
}

/**
 * 雇员类
 */
class Employee {
    private String name;
    //部门
    private String department;
    //薪水
    private int salary;
    //下属集合
    private List<Employee> subordinates;

    //构造函数
    public Employee(String name, String dept, int sal) {
        this.name = name;
        this.department = dept;
        this.salary = sal;
        subordinates = new ArrayList<Employee>();
    }

    /**
     * 为该雇员添加手下
     *
     * @param e
     */
    public void add(Employee e) {
        subordinates.add(e);
    }

    public void remove(Employee e) {
        subordinates.remove(e);
    }

    public List<Employee> getSubordinates() {
        return subordinates;
    }

    public String toString() {
        return ("Employee :[ Name : " + name
                + ", dept : " + department + ", salary :"
                + salary + " ]");
    }
}
发布了58 篇原创文章 · 获赞 75 · 访问量 6652

猜你喜欢

转载自blog.csdn.net/qq_42013035/article/details/103770767
今日推荐