ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

八戒转世投胎竟然是Java设计模式:桥接模式

2021-04-17 11:03:12  阅读:178  来源: 互联网

标签:body Java 桥接 void System class color 设计模式 public


目录

示例

请开发一个画图程序,可以画各种颜色不同形状的图形,请用面向对象的思
想设计图形
分析:
1、比如有红、黄、蓝三种颜色
2、形状有方形、圆、三角形
3、圆可以是红圆、黄圆、蓝圆
在这里插入图片描述
从上面可以看到,变化的地方有两个:
1、形状
2、颜色
任其在两个维度各自变化,为这两个维度搭个桥,让它们可以融合在一起,就是桥接模式,那么该如何搭呢?
需要从两个地方入手:
1:抽象
分别对各个维度进行抽象,将共同部分抽取出来
在这里插入图片描述
2:组合
将抽象组合在一起(桥接)
在这里插入图片描述

代码实例

抽象出形状和颜色,对应的类如下:
形状抽象类:持有颜色实例

public abstract class Shape {

    protected Color color;

    public Shape(Color color) {
        this.color = color;
    }

    /** 画图形 */
    abstract void draw();
}

颜色接口:

public interface Color {

    /** 上色 */
    void coloring();
}

不同的形状对应的实现类:

public class Circle extends Shape {

    public Circle(Color color) {
        super(color);
    }

    @Override
    public void draw() {
        this.color.coloring();
        System.out.print("圆");
    }
}
public class Rect extends Shape {

    public Rect(Color color) {
        super(color);
    }

    @Override
    public void draw() {
        this.color.coloring();
        System.out.print("矩形");
    }
}
public class Triangle extends Shape {

    public Triangle(Color color) {
        super(color);
    }

    @Override
    public void draw() {
        this.color.coloring();
        System.out.print("三角形");
    }
}

不同的颜色对应的实现类:

public class Red implements Color {
    @Override
    public void coloring() {
        System.out.print("红色-》");
    }
}
public class Yellow implements Color {
    @Override
    public void coloring() {
        System.out.print("黄色-》");
    }
}
public class Blue implements Color {
    @Override
    public void coloring() {
        System.out.print("蓝色-》");
    }
}

测试类:

public class Test {

    public static void main(String[] args) {
        //画一个红色的圆
        Shape redCircle = new Circle(new Red());
        redCircle.draw();
        System.out.println();

        //画一个黄色的矩形
        Shape yellowRect = new Rect(new Yellow());
        yellowRect.draw();
        System.out.println();

        //画一个蓝色的三角形
        Shape blueTriangle = new Triangle(new Blue());
        blueTriangle.draw();
    }
}

在这里插入图片描述
类图:
在这里插入图片描述

桥接模式

定义

将多个维度的变化以抽象的方式组合在一起。使用者面向抽象。各维度间解耦,可自由变化

意图

将抽象部分与实现部分分离,使它们都可以独立的变化

主要解决问题

在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵

何时使用

实现系统可能有多个角度分类,每一种角度都可能变

优缺点

优点:

  1. 抽象和实现的分离
  2. 优秀的扩展能力
  3. 实现细节对客户透明

缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程

类图:
在这里插入图片描述
涉及的角色:

  1. 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用
  2. 修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义
  3. 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现
  4. 具体实现化(ConcreteImplementor)角色:这个角色给出实现化角色接口的具体实现

对应的源码如下:

public abstract class Abstraction {

    protected Implementor implementor;

    public void operation(){
        implementor.operationImpl();
    }
}
public class RefinedAbstraction extends Abstraction {

    @Override
    public void operation() {
        super.operation();
    }
}
public abstract class Implementor {

    public abstract void operationImpl();
}
public class ConcreteImplementor extends Implementor {
    @Override
    public void operationImpl() {
        //do something......
    }
}

八戒转世投胎的故事

《西游记》中天蓬元帅转世成为猪八戒的故事,大家耳熟能详,现在从桥接模式的观点出发,来看一下这个故事:
如果存在灵魂的话,应当是抽象化角色,而肉体则是实现化角色,肉体为灵魂的功能提供了实现
在这里插入图片描述
抽象化角色:灵魂

public interface Soul {

    /** 灵魂 */
    void mySoul();
}

修正抽象化角色:

public class SoulRefined1 implements Soul {

    private Body body;

    public SoulRefined1(Body body) {
        this.body = body;
    }

    @Override
    public void mySoul() {
        System.out.println("天蓬元帅");
        this.body.myBody();
    }
}
public class SoulRefined2 implements Soul {

    private Body body;

    public SoulRefined2(Body body) {
        this.body = body;
    }

    @Override
    public void mySoul() {
        System.out.println("飞禽走兽");
        this.body.myBody();
    }
}

实现化角色:肉体

public interface Body {

    /** 肉体 */
    void myBody();
}

具体实现化角色:

public class ConcreteBody1 implements Body {

    @Override
    public void myBody() {
        System.out.println("转世成人");
    }
}
public class ConcreteBody2 implements Body {
    @Override
    public void myBody() {
        System.out.println("转世成猪");
    }
}

测试类:

public class Test {

    public static void main(String[] args) {
        Body body = new ConcreteBody2();
        Soul soul = new SoulRefined1(body);
        soul.mySoul();
    }
}

在这里插入图片描述
类图:
在这里插入图片描述

标签:body,Java,桥接,void,System,class,color,设计模式,public
来源: https://www.cnblogs.com/fox2said/p/14669706.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有