首页 > 其他分享 >设计模式03:原型模式、适配器模式、桥接模式、组合模式

设计模式03:原型模式、适配器模式、桥接模式、组合模式

时间:2023-10-27 21:13:39浏览次数:35  
标签:name 桥接 适配器 AbstractFile 模式 public class void String

1.Prototype原型模式

 代码示例:

package Prototype05;

/**
 * 原型模式:
 * 意图:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象
 * 适用于:
 *      当一个系统应该独立于它的产品创建、构成和表示时
 *      当要实例化的类是在运行时刻指定时例如通过动态装载
 *      为了避免创建一个与产品类层次平行的过程类层次时
 *      当一个类的实例只能有几个不同状态组合的一种时,建立响应的数目的原型并且克隆他
 */
public class Main {
    public static void main(String[] args) {
        Product product=new Product(1,10.10);
        System.out.println(product.getId()+" "+product.getPrice());
        Product clone = (Product) product.Clone();
        System.out.println(clone.getId()+" "+clone.getPrice());
    }
}
interface Prototype {
    public Object Clone();
}
class Product implements Prototype{
    private int id;
    private double price;

    public Product(){}

    public Product(int id,double price){
        this.id = id;
        this.price=price;
    }

    public int getId(){
        return id;
    }
    public double getPrice(){
        return price;
    }

    @Override
    public Object Clone() {
        Product product = new Product();
        product.id=this.id;
        product.price=this.price;
        return product;
    }
}

2.Adapt适配器模式

 

示例代码:

package Adapt06;

/**
 * 适配器模式
 * 意图:
 *      将一个类的接口转换成客户希望的另一个接口。
 *      Adapt模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
 * 适用于:
 */
public class Adapt {
    public static void main(String[] args) {
        //将待适配的接口转换为目标接口
        //实例化目标接口
        Target target = new Adapter();
        target.Request();
    }
}
//将Type—C转换为USB接口
//目标接口:例如USB
class Target {
    public void Request(){
        System.out.println("普通请求:USB数据线");
    }
}
//适配接口:例如Type-C
class Adaptee {
    public void SpecificRequest(){
        System.out.println("特殊请求:Type-C数据线");
    }
}
//适配器
class Adapter extends Target{
    private Adaptee adaptee = new Adaptee();
    @Override
    public void Request(){
        adaptee.SpecificRequest();
    }
}

 

3.Bridge桥接模式

 

示例代码:

package Bridge07;

/**
 * 桥接模式
 * 意图:将抽象部分与实现部分分离,使他们都可以独立地变化
 *
 */
public class Bridge {
    public static void main(String[] args) {
        Product product = new ProductA();
        Color red =new Red();
        product.setName("产品A");
        product.setColor(red);
        product.Operation();

    }
}

abstract class Product{
    //产品的名字
    private String name;
    protected Color color;
    public void setColor(Color color){
        this.color=color;
    }
    public abstract void Operation();

    public void setName(String name){
        this.name=name;
    }
    public String getName(){
        return name;
    }
}
//具体产品
class ProductA extends Product{
    @Override
    public void Operation() {
        color.OperationImpl(this.getName());
    }
}
interface Color{
    public void OperationImpl(String name);
}
class Red implements Color{
    @Override
    public void OperationImpl(String name){
        System.out.println(name+" :红色");
    }
}
class Blue implements Color{
    @Override
    public void OperationImpl(String name){
        System.out.println(name+" :蓝色");
    }
}

 

4.Composite组合模式

 

示例代码:

package Composite08;

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

/**
 * 组合模式
 * 意图: 将该对象组合成树形结构以表示“部分-整体”的层次结构。
 *      Composite使得用户对单个对象和组合对象的使用具有一致性。
 * 例子:文件和文件夹的关系
 * 适用于:
 *      想表示对象的部分和整体层次结构
 *      希望用户忽略组合对象与单个对象的不同,用户将统一使用组合结构的所有对象
 */
public class CompositePattern {
    public static void main(String[] args) {
        //第一部分:普通测试
        AbstractFile folderA = new Folder("folderA");
//        folderA.printName();
        AbstractFile folderB = new Folder("folderB");
        folderA.Add(folderB);
//        folderB.printName();
        AbstractFile file00 = new File("file00");
//        file00.printName();
        //第二部分:文件夹增加删除测试
        AbstractFile root = new Folder("root");
        root.Add(folderA);
        root.Add(file00);
//        root.Remove(file00);
        //第三部分:遍历组合获取子组件
        print(root);
    }
    static void print(AbstractFile file){
        file.printName();
        List<AbstractFile> childrenList = file.getChildren();
        if(childrenList == null) return;
        for (AbstractFile children:childrenList) {
//            children.printName();
            print(children);
        }
    }
}
//Component
abstract class AbstractFile{

    protected String name;

    public void printName(){
        System.out.println(name);
    }
    //public abstract boolean Add();
    public abstract void Add(AbstractFile file);
    public abstract void Remove(AbstractFile file);
    public abstract List<AbstractFile> getChildren();


}
//Composite:Folder文件夹
class Folder extends AbstractFile{

    private List<AbstractFile> childrenList = new ArrayList<AbstractFile>();


    public Folder(String name){
        //将name赋值给父类的name
        this.name=name;
    }

    @Override
    public void Add(AbstractFile file) {
        childrenList.add(file);
    }

    @Override
    public void Remove(AbstractFile file) {
        childrenList.remove(file);
    }

    @Override
    public List<AbstractFile> getChildren() {
        return childrenList;
    }
}
//Leaf:File文件
class File extends AbstractFile{
    public File(String name){
        //将name赋值给父类的name
        this.name=name;
    }

    @Override
    public void Add(AbstractFile file) {
        return;
    }

    @Override
    public void Remove(AbstractFile file) {
        return;
    }

    @Override
    public List<AbstractFile> getChildren() {
        return null;
    }
}

 

标签:name,桥接,适配器,AbstractFile,模式,public,class,void,String
From: https://www.cnblogs.com/hmy22466/p/17793140.html

相关文章

  • 设计模式04:装饰器模式、享元模式、命令模式、观察者模式
    1.Decorator装饰器模式 示例代码:packageDecorator09;/***装饰器模式*意图:动态的给一个对象添加一些额外的职责。*适用性:*在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责*处理那些可以撤销的职责*/publicclassDecoratorPatt......
  • 软考上午05设计模式-行为型
    责任链模式:意图:使多个对象都有机会处理请求,避免请求的发送者和接受者有耦合关系。将这些对象连成一条链适用:多个的对象可以处理一个请求,具体哪个处理在运行时确定在不明确指明接收者的情况下向多个对象中的一个提交请求可处理一个请求的对象......
  • API - 几种API接口模式 - RESTful、WebSocket、GraphQL、gRPC、Webhook
    总结TODO.....当思考使用哪种API接口时,你将会面临一个重要的决策。RESTful、GraphQL、gRPC、WebSocket和Webhook是当前流行的几种API接口模式。在本文中,我们将介绍这些接口的特点、用途和比较,帮助你选择最适合你应用程序需求的接口。引言随着现代应用程序的复杂性和用户期望的......
  • 行为型模式(一) 责任链模式
    责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象能够处理它为止。角色:抽象处理者具体处理者客户端fromabcimportABCMeta,abstractmethodclassManager(metaclass=ABCMeta......
  • 设计模式-策略模式
    参考:https://blog.51cto.com/u_16125162/6329805定义:策略模式(StrategyPattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。是一种对象行为型模式。打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方......
  • 单例模式-双重校验锁
    参考;https://blog.csdn.net/weixin_44471490/article/details/108929289双重校验锁饿汉模式是不需要加锁来保证单例的,而懒汉模式虽然节省了内存,但是却需要使用锁来保证单例,因此,双重校验锁就是懒汉模式的升级版本。普通懒汉式publicclassSingleton{ privatestatic......
  • 小端模式和大端模式——踩坑记录
    大端小端1前言在做项目时,需要将报文发送给硬件端,报文打包我都是用的大端写入Bytebuf(使用的netty),老大审查代码时,说我写错了,说硬件那边要求是小端传输。不过改成小端写入也容易,重要的是牢记这个知识点。于是趁这个机会复习一下大端和小端。2概念大端(Big-Endian)和小端(Litt......
  • uniapp的easycom模式
    uniapp的easycom模式,无需import和注册components,即可在页面使用固定目录下的组件。这个目的是简化引用,其实还挺坑的。1.直接使用组件,全局又搜索不到引用,第一感觉让人摸不着头脑2.不引用组件,文件下放了多个组件,不知道到底使用了哪个3.进行组件优化,要删除或提取某些组件的时......
  • 【编程开发指南】「设计模式系列」一起来学编程界的“兵法”设计模式(序章)
    设计模式是什么设计模式是一种被广泛应用于软件开发中的技术,它可以帮助开发人员更好地组织和管理代码,提高代码的可读性和可维护性。本文将介绍设计模式的概念、分类和应用场景。设计模式的概念设计模式是一种被反复使用的代码设计经验,它可以解决特定问题的通用解决方案。设计模式不......
  • 软件设计之抽象工厂模式
    类图代码packagetest;importjava.util.Scanner;publicclasstest3{publicstaticvoidmain(String[]args){Factorysfactory=null;ProductAproductA=null;ProductBproductB=null;System.out.println("请输入你想要的......