Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试官:代理模式和装饰器模式的区别

面试官:代理模式和装饰器模式的区别

作者头像
田维常
发布于 2024-04-17 08:12:18
发布于 2024-04-17 08:12:18
40500
代码可运行
举报
运行总次数:0
代码可运行

通常在回答xxx模式与yyy模式的区别,第一印象就是要分清楚他们两是不是同一类。

下面给大家整理设计模式分类:

从图中可以看出,代理模式和装饰器膜还是都属于结构型设计模式

下面我们通过代码案例来看这两个设计模式到底有什么区别:

代理模式案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 定义接口
interface Image {
    void display();
}

// 被代理类
class RealImage implements Image {
    private String filename;
    
    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk();
    }
    
    private void loadFromDisk() {
        System.out.println("Loading image from disk: " + filename);
    }
    
    public void display() {
        System.out.println("Displaying image: " + filename);
    }
}

// 代理类
class ImageProxy implements Image {
    private String filename;
    private RealImage realImage;
    
    public ImageProxy(String filename) {
        this.filename = filename;
    }
    
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}

// 使用代理类
public class ProxyPatternExample {
    public static void main(String[] args) {
        Image image = new ImageProxy("image.jpg");
        image.display();
    }
}

装饰器模式案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 定义接口
interface Shape {
    void draw();
}

// 具体实现类
class Circle implements Shape {
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

// 装饰器类
abstract class ShapeDecorator implements Shape {
    protected Shape decoratedShape;
    
    public ShapeDecorator(Shape decoratedShape) {
        this.decoratedShape = decoratedShape;
    }
    
    public void draw() {
        decoratedShape.draw();
    }
}

// 具体装饰器类
class RedShapeDecorator extends ShapeDecorator {
    public RedShapeDecorator(Shape decoratedShape) {
        super(decoratedShape);
    }
    
    public void draw() {
        decoratedShape.draw();
        setRedBorder();
    }
    
    private void setRedBorder() {
        System.out.println("Adding red border");
    }
}

// 使用装饰器类
public class DecoratorPatternExample {
    public static void main(String[] args) {
        Shape circle = new Circle();
        ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
        
        circle.draw();
        redCircle.draw();
    }
}

这两个例子分别展示了代理模式和装饰器模式的使用方式和区别。

总结

代理模式和装饰器模式是两种不同的设计模式,虽然它们有一些共同的特点,但是在使用方式和实现上有一些区别。

区别如下:

  1. 目的不同:代理模式的主要目的是为了控制对对象的访问,而装饰器模式的主要目的是为了给对象添加额外的功能。
  2. 关注点不同:代理模式关注于对对象的访问进行控制和管理,装饰器模式关注于对对象的功能进行增强。
  3. 涉及的类不同:代理模式通常涉及到三个角色,即接口、代理类和被代理类,而装饰器模式通常只涉及一个接口和多个装饰器类。
  4. 功能增强方式不同:代理模式通过在代理类中调用被代理类的方法实现功能增强,而装饰器模式通过在装饰器类中调用被装饰对象的方法,并在其前后添加额外的功能实现功能增强。

代理模式在项目中,用的最多的就是动态代理(比如:JDK、CGLib)。

装饰器模式基本上都是用在老项目中,或者说对已经完好的功能进行功能增强。

记住核心点:访问权限、功能增强

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后端技术全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Android 应用开发】 ActionBar 基础
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/39204393
韩曙亮
2023/03/27
1.3K0
【Android 应用开发】 ActionBar 基础
安卓开发_浅谈Action Bar
一、Action Bar 导航栏。是3.0之后出现的。 所以注意使用的时候清单文件要设置下  android:minSdkVersion="11"(至少11) 但如果使用v4包,则不需修改 二、ActionBar常用操作 1、删除Action Bar 因为3.0默认的主题默认创建Action Bar,所以只要设置下主题Theme.Holo.NoActionBar <activity android:theme="@android:style/Theme.Holo.NoActionBar"> 2、隐藏Ac
听着music睡
2018/05/18
9060
Android系列之ActionBar使用详解
在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果。
SmileNicky
2022/05/10
3.8K0
Android ActionBar应用实战,高仿微信主界面的设计
本文主要介绍了如何通过自定义View实现微信主界面的效果,包括TabHost、PagerSlidingTabStrip、ViewPager和Fragment等组件的配置和使用方法。同时,还介绍了一种实现滑动Tab效果的方案,以及自定义View和动态加载layout的技巧。
用户1158055
2018/01/05
1.5K0
Android ActionBar应用实战,高仿微信主界面的设计
超详细!ActionBar 使用·详解 .
  在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和menu,在程序运行中一直置于顶部,对于Android平板设备来说屏幕更大它的标题使用Action Bar来设计可以展示更多丰富的内容,方便操控。
张哥编程
2024/12/17
5150
超详细!ActionBar 使用·详解 .
Android开发:最详细的 Toolbar 开发实践总结
最详细的 Toolbar 开发实践总结 过年前发了一篇介绍 Translucent System Bar 特性的文章 Translucent System Bar 的最佳实践,收到很多开发者的关注和反
非著名程序员
2018/02/02
1.4K0
Android开发:最详细的 Toolbar 开发实践总结
Material Design 实战 之第一弹——Toolbar详解
本模块共有六篇文章,参考郭神的《第一行代码》,对Material Design的学习做一个详细的笔记,大家可以一起交流一下:
凌川江雪
2018/10/09
7890
Material Design 实战 之第一弹——Toolbar详解
1.ActionBar
ActionBar 低版本和高版本用法不同 低版本: 1. 引用v7-appcompat 2. Activity继承ActionBarActivity 3. android:theme="@style/Theme.AppCompat.Light" > 高版本: 1. Activity自带actionBar 2.从Android3.0(APIlever11)开始,所有使用Theme.Holo主题(或者它的子类)的activity都包含了actionbar,当 targetSdkVersion或min
六月的雨
2018/05/14
9650
Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)
用户1158055
2018/01/05
1.6K0
Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)
Android AppBar
AppBar官方文档摘记 2016-6-12 本文摘自Android官方文档,为方便自己及其他开发者朋友阅读。 章节目录为“Develop > Training > Best Practices f
用户1172465
2018/01/08
9900
Android AppBar
Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)
本文主要介绍了如何在Android开发中使用ActionBar来提高应用程序的用户体验。主要包括了ActionBar的基本用法、如何自定义ActionBar以及如何使用ActionBar将应用程序导航到不同的页面和操作。同时,还介绍了一些与ActionBar相关的扩展用法,如使用Action View、Action Provider以及自定义视图等。通过本文的介绍,可以帮助开发人员更好地利用ActionBar来提高应用程序的用户体验和交互性。
用户1158055
2018/01/05
3.5K0
Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)
Android开发笔记(一百一十九)工具栏ToolBar
在前面的博文《Android开发笔记(二十)顶部导航栏》中,我们学习了ActionBar的用法,可是ActionBar着实是不怎么好用,比如文字风格不能定制、图标不能定制,而且还存在低版本的兼容性问题,所以实际开发中大家还是不倾向使用ActionBar。为此,Android提供了加强版的工具栏控件即Toolbar,因为Toolbar继承自ViewGroup,而且可在布局文件中像其它布局视图一样使用,所以灵活性大大的提高了。既然Android都与时俱进了,那我们也不能落后,现在就来好好学学Toolbar的用法。
aqi00
2019/01/18
2K0
使用ActionBar实现Tab导航(快速生成Tab样式)
效果如图: MainActivity.java具体实现: package com.rainmer.actionbartab; import android.app.ActionBar; import
用户1737026
2018/05/17
1.8K0
Toolbar-5.0新特性
Android5.0以后谷歌大力推崇Material Design设计,有意统一之前Android style风格乱象的情况。
小小工匠
2021/08/16
4840
Mono for Android 实现高效的导航
Android 4.0 系统定义了一系列的高效导航方式 (Effective Navigation), 主要包括标签、下拉列表、以及向上和返回等, 本文介绍如何用 Mono for Android 实现这些的导航方式。
beginor
2020/08/06
7950
Head First Android Toolbar
上一节我们介绍了ActionBar的使用,这一节我们介绍ActionBar 的替代者——Toolbar,看看它有多大的能耐!
宅男潇涧
2018/08/01
9360
Head First Android Toolbar
安卓开发_深入学习ViewPager控件
一、概述 ViewPager是android扩展包v4包(android.support.v4.view.ViewPager)中的类,这个类可以让用户左右切换当前的view。 ViewPager特点:   1)ViewPager类直接继承了ViewGroup类,所以它是一个容器类,可以在其中添加其他的view类。   2)ViewPager类需要一个PagerAdapter适配器类(通常需要自定义适配器继承PagerAdapter类重写其中的方法)给它提供数据。   3)ViewPag
听着music睡
2018/05/18
2.1K0
DrawerLayout详解「建议收藏」
drawerLayout是Support Library包中实现了侧滑菜单效果的控件,可以说drawerLayout是因为第三方控件如MenuDrawer等的出现之后,google借鉴而出现的产物。drawerLayout分为侧边菜单和主内容区两部分,侧边菜单可以根据手势展开与隐藏(drawerLayout自身特性),主内容区的内容可以随着菜单的点击而变化(这需要使用者自己实现)。
全栈程序员站长
2022/07/04
2.7K0
DrawerLayout详解「建议收藏」
Android Material Design系列之Toolbar
今天我们主要讲Toolbar的使用,我们都知道Toolbar是在Android 5.0以后推出来的,之前都是ActionBar这个控件。我相信虽然谷歌在3.0以后推出了ActionBar,但是用的人肯定很少,因为个人认为它比较恶心。而且Android对ActionBar的界定很模糊,Toolbar和ActionBar在外观上并没有太大的区别,只是说Toolbar更加自由了,而不像ActionBar那样有太多系统定制的条条框框。 Toolbar包含哪些元素呢 一个Toolbar包含哪些元素呢?通过我们看API
非著名程序员
2018/02/02
8880
Android Material Design系列之Toolbar
利用 v7 Toolbar 自定义 Android ActionBar
要使用 Toolbar,首先要在 layout 里面添加组件,例如在 activity_main.xml 里添加
tonglei0429
2019/07/22
1.6K0
利用 v7 Toolbar 自定义 Android ActionBar
相关推荐
【Android 应用开发】 ActionBar 基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验