[DP]Bridge设计模式

Bridge桥接模式 《设计模式》一书对Bridge是这样描述的:将抽象与其实现解耦,使它们都可以独立地变化。大致意思是说:将一组实现与另一组使用他们的对象分离。这里的实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类)。下面是《Design Patterns Explained》书中的例子。其结构图如下:  下面是它的实现:abstract class 阅读详情

这次我们继续接着我们的KFGStoe连锁餐厅

我们的KFG连锁餐厅在全国各地都有连锁加盟,因为各地的口味风俗差异,所以我们的KFG餐厅都是非常具有地方特色的。

用马克思主义讲,就是我们的KFG餐厅因地制宜,将KFG餐饮风格与地方特色相结合。

什么是地方特色,就是我们的KFG餐厅根据当地饮食习惯制作出符合当地饮食的料理,店面装修也具有当地的特色。

所以这个时候我们就有了北京小清新风格KFG餐厅,北京豪华风格KFG餐厅,南京小清新风格KFG餐厅,南京豪华风格KFG餐厅。

假如我们用程序代码来表示就是

class NanjingXiaoQingXinKFGStore {
	private KGFFoodLine foodLine = new NanjingFoodLine();
	// ...小清新风格的装饰
}

class NanjingHaoHuaKFGStore {
	private KGFFoodLine foodLine = new NanjingFoodLine();
	// ...豪华风格的装饰
}

class BeijingXiaoQingXinKFGStore {
	private KGFFoodLine foodLine = new BeijingFoodLine();
	// ...小清新风格的装饰
}

class BeijingHaoHuaKFGStore {
	private KGFFoodLine foodLine = new BeijingFoodLine();
	// ...豪华风格的装饰
}

这个时候问题来了,全国至少上千个城市,那么我们的 不同装修风格的 *  地方饮食 将会是一个很庞大的数字,我们是不是真的要写出这么多类来?


这种将风格与特色相互仅仅结合的设计 并不是我们想要的,我们想要的是可以扩展的。

那么怎么扩展呢?

我们只要有一类通用的KFGStore 不管我们是北京小清新风格KFG餐厅,北京豪华风格KFG餐厅,南京小清新风格KFG餐厅,南京豪华风格KFG餐厅。

它们都是KFG餐厅,它们的主要职责都是服务顾客,让顾客在店内有着良好的心情。

至此我们需要抽取店内的共性,然后离散特性。

interface KGFFoodLine {
	public Food cookChip();

	public Food cookHamberger();

	public Food cookChicken();
}

class BeijingFoodLine implements KGFFoodLine {

	@Override
	public Food cookChip() {
		return new Chip("Beijing Chip");
	}

	@Override
	public Food cookHamberger() {
		return new Hamburger("Beijing Hamberger");
	}

	@Override
	public Food cookChicken() {
		return new Chicken("Beijing Chicken");
	}
}

class NanjingFoodLine implements KGFFoodLine {

	@Override
	public Food cookChip() {
		return new Chip("Nanjing Chip");
	}

	@Override
	public Food cookHamberger() {
		return new Hamburger("Nanjing Hamberger");
	}

	@Override
	public Food cookChicken() {
		return new Chicken("Nanjing Chicken");
	}
}

interface Cook {
	public Food cook(FoodType type);
}

abstract class KFGStore implements Cook {
	private KGFFoodLine foodLine;

	public void setFoodLine(KGFFoodLine foodLine) {
		this.foodLine = foodLine;
	}

	@Override
	public Food cook(FoodType type) {
		switch (type) {
		case CHIP:
			return foodLine.cookChip();
		case HAMBURGER:
			return foodLine.cookHamberger();
		case CHICKEN:
			return foodLine.cookChicken();
		default:
			break;
		}
		return null;
	}

	abstract public void decoratePatternDescribe();

}

class QingXinKFGStore extends KFGStore {
	// ...小清新风格的装饰
	@Override
	public void decoratePatternDescribe() {
		// TODO Auto-generated method stub

	}
}

class HaoHuaKFGStore extends KFGStore {
	// ...豪华风格的装饰
	@Override
	public void decoratePatternDescribe() {
		// TODO Auto-generated method stub

	}
}



 解决方案:

桥连模式:将抽象部分与实现部分分离,使它们都可以独立的变化。它是一种结构性模式,又称柄体(Handle and body)模式或者接口(Interface)模式。        当一个抽象可能有多个实现时,通常用继承来协调他们。抽象类的定义对该抽象的接口。而具体的子类则用不同的方式加以实现,但是此方法有时不够灵活。继承机制将抽象部分与他的视线部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和充用。

理解桥接模式,重点需要理解如何将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。



构建模式的组成
抽象类(Abstraction):定义抽象类的接口,维护一个指向Implementor类型对象的指针
扩充抽象类(RefinedAbstraction):扩充由Abstraction定义的接口
实现类接口(Implementor):定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来讲, Implementor接口仅提供基本操作,而 Abstraction则定义了基于这些基本操作的较高层次的操作。
具体实现类(ConcreteImplementor):实现Implementor接口并定义它的具体实现。



按照上述定义,我们寻找该模式的角色对应关系吧。

抽象类:KFGStore,持有一个KFGFoodLine 接口,该接口的具体实现提供不同风格的地方美食。同时定义了一个描述装饰样式的抽象方法,由子类去实现。

扩充抽象类:QingXinKFGStore,HaoHuaKFGStore。对抽象类的方法进行实现,以产生不同装修风格的餐厅。

实现类接口:KFGFoodLine,制作各种美食,提供烹制各种各样美食的基本操作,具体怎么组合,在抽象类中依据顾客的请求合理的调用foodLine.cookxxx()

具体实现:NanjingFoodLine,BeijingFoodLine。按照接口产生独特的美食。


假设 我们 原来有 4种装修 风格, 4 种 美食风格,按照原先的设计方式,那么我们将会得到 4 x 4个类。

但是改进之后 使用Bridge设计模式后, 我们只要 4 + 4个类即可。


我这里需要强调一个问题,那就是使用桥接模式的主要目的并不是减少类,而是将抽象和实现解耦,分离接口及其实现部分,提高可扩充性。


适用性
1). 你不希望在抽象和他的实现部分之间有一个固定的绑定关系,如在程序的运行时刻实现部分应该可以被选择或者切换。
2). 类的抽象以及他的视像都可以通过生成子类的方法加以扩充。这时bridge模式使你可以对不同的抽象接口和实现部分进行组合,并对他们进行扩充。
3). 对一个抽象的实现部分的修改应该对客户不产生影响,即客户的代码不需要重新编译。
4). 你想对客户完全隐藏抽象的实现部分。
5). 你想在多个实现间 共享实现,但同时要求客户并不知道这一点。




这里举spring中ClassPathApplicationContext类作为例子。

我们都知道ClassPathApplicationContext里面有个getBean方法,而这个getBean是BeanFactory接口的实现。

package org.springframework.beans.factory;

import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;

public interface BeanFactory {

	String FACTORY_BEAN_PREFIX = "&";

	Object getBean(String name) throws BeansException;

	<T> T getBean(String name, Class<T> requiredType) throws BeansException;

	<T> T getBean(Class<T> requiredType) throws BeansException;

	Object getBean(String name, Object... args) throws BeansException;

	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

	boolean containsBean(String name);

	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

	boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

	Class<?> getType(String name) throws NoSuchBeanDefinitionException;

	String[] getAliases(String name);

}
而该ClassPathApplicationContext中getBean的实现则是从其父类AbstractApplicationContext实现的。

AbstractApplicationContext:

@Override
	public Object getBean(String name) throws BeansException {
		assertBeanFactoryActive();
		return getBeanFactory().getBean(name);
	}

	@Override
	public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
		assertBeanFactoryActive();
		return getBeanFactory().getBean(name, requiredType);
	}

	@Override
	public <T> T getBean(Class<T> requiredType) throws BeansException {
		assertBeanFactoryActive();
		return getBeanFactory().getBean(requiredType);
	}

	@Override
	public Object getBean(String name, Object... args) throws BeansException {
		assertBeanFactoryActive();
		return getBeanFactory().getBean(name, args);
	}

	@Override
	public <T> T getBean(Class<T> requiredType, Object... args) throws BeansException {
		assertBeanFactoryActive();
		return getBeanFactory().getBean(requiredType, args);
	}

该父类中的getBeanFactory()实际上是从其父类中继承下来的,对其不可见,只提供了公共接口getBeanFactory()访问

实际上等同于

beanFactory.getBean()


而这里我们的具体BeanFactory实现类则是DefaultListableBeanFactory

ClassPathApplicationContext 并不是唯一的context,还有WebApplicationContext,AnnotationApplicationContext等。

所以我们这里整理一下思路,按照之前的角色划分整理:

抽象类(Abstraction): AbstractApplicationContext

扩充抽象类(RefinedAbstraction):ClassPathApplicationContext,WebApplicationContext,AnnotationApplicationContext
实现类接口(Implementor):BeanFactory。
具体实现类(ConcreteImplementor):DefaultListableBeanFactory




dp-bridge:桥接DP的实现示例 桥梁设计模式示例 尽管此项目不是基于任何特定的教程,但是在实现代码时,我主要使用解释作为主要参考。 项目概况 该项目没有GUI,因为目标是了解结构。 我们的想法是,我们有三个要应用于数据的过滤器。 PestShareChart代表抽象而areaFilter , cultivarTypeFilter和pestTypeFilter包代表实现和具体实现。 客户端在PestShareChart上调用main方法,该方法又调用适当的过滤器并执行复杂的操作以返回结果。 类结构 因为每个包都表示一个实现, areaFilter除了Abstraction之外,我们仅关注areaFilter包中的类。 PestShareChart表示抽象。 这是Client可以访问的类。 此类负责调用适当的Implementations并使用结果执行复杂的操作; IAreaDataRetriever这是使用的第一个过滤 立即下载

相关推荐

Cisco思科 电子科技大学计算机网络 SRWE 期末技能考试 (PTSA)

电子科技大学2024春_SRWE_计算机网络系统 SRWE 期末技能考试 (PTSA)

2301_76745065的博客 5094

docker 创建容器时指定容器ip

​ 一、背景 Docker创建容器时默认采用bridge网络,自行分配ip,不允许自己指定。在实际部署中,我们需要指定容器ip,不允许其自行分配ip,特别是集群。 二、方法 我们可以创建自己的bridge网络 : bridge-dp,创建容器的时候指定网络为bridge-dp并指定ip即可。 1 、查看网络模式 docker network ls 2、创建一个新的bridge网络 docker network create --driver bridge --subnet=192.168.103.1/2

zhengdesheng19930211的博客 524

详解k-means++

一、概述 定义:k-means++是一种为k-means聚类算法选择初始值(或“种子”)的算法。它是NP-hard k-means问题的一种近似算法,它是一种避免标准k-means算法有时发现的较弱聚类的方法。 K-means与K-means++:原始K-means算法最开始随机选取数据集中K个点作为聚类中心,而K-means++按照如下的思想选取K个聚类中心:假设已经选取了n个初始聚类中心(0<n<K),则在选取第n+1个聚类中心时:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚

qq_42364307的博客 3万+

Bridge Automation(dp)

题:https://cn.vjudge.net/problem/Gym-101490D #include<bits/stdc++.h> #define ll long long using namespace std; const int maxn = 4e3+50; int dp[maxn]; int a[maxn]; int main() { ios_base::syn...

T.J的博客 328

AI 代码生成工具的质量评估体系

基础需求层包括响应速度(Response Time)和界面友好性(UI Friendliness),期望需求层涵盖智能提示(Smart Suggestions)和个性化配置(Personalization),兴奋需求层则涉及多模态交互(Multimodal Interaction)和代码进化(Code Evolution)。在金融领域,代码审计合规性(Compliance Audit)权重应提升至40%,而在Web开发中,API兼容性(API Compatibility)的权重需达到35%。

2503_92418637的博客 3372

从XSA到Linux应用:Petalinux与Vitis的嵌入式开发全流程解析

本文详细解析了从XSA文件到Linux应用的嵌入式开发全流程,重点介绍了Petalinux与Vitis工具链的使用技巧和实战经验。通过XSA硬件描述、Petalinux工程搭建、系统镜像优化及Vitis开发配置等关键步骤,帮助开发者高效完成ZYNQ平台开发,解决常见问题并提升开发效率。

weixin_29195217的博客 191

【设计模式——学习笔记】23种设计模式——桥接模式Bridge(原理讲解+应用场景介绍+案例介绍+Java代码实现)

讲解桥接模式的思想,介绍其常见的应用场景,举例说明桥接模式的实现方式

我只管埋头前行,剩下的交给时间。 3290

电子图像增稳(EIS)原理详解——从抖动补偿到代码实现

电子图像增稳(EIS)是一种通过软件算法实现视频稳定的技术,广泛应用于GoPro、手机和无人机等设备。与光学防抖(OIS)和机械云台不同,EIS通过图像裁切和运动补偿来消除抖动,具有成本低、补偿范围大的优点,但会损失10-30%的画幅。其核心流程包括运动检测、抖动分离、运动补偿和图像裁切四个步骤。相比硬件方案,纯软件实现的EIS更适合消费级电子产品,已成为移动设备视频拍摄的重要技术。

电脑管家 409

设计模式第12讲——桥接模式(Bridge)

桥接模式是一种结构型设计模式。一、什么是桥接模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 UML类图 5.1实现部分——Bluetooth5.2 具体实现——BluetoothImpl5.3 抽象部分——Phone5.4 具体抽象六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 2791

AD22等长布线规则

本文介绍了PCB布线中实现信号线等长的详细操作步骤:1.创建网络类(NetClass),将需要等长的信号线归入同一组;2.设置高速布线规则(High-SpeedRule),定义等长容差等参数;3.进行交互式等长布线(InteractiveLengthTuning),使用蛇形线调整线长;4.实时调整与最终检查,确保所有网络满足等长要求。文中还提供了实用技巧,如使用快捷键调整蛇形线参数、为关键信号设置更严格规则等。操作需在PCB设计软件中完成,通过统一管理、规则设置和精确调整来实现信号同步传输。

whm128的博客 1557

uniapp(微信小程序):实现PDF在线预览+在线预览pdf文件完整示例源码,支持文件来源:服务器pdf外链URL预览、调用后端API接口获取PDF文件流二进制下载及解析打开、上传本地PDF文件预览

uni-app实现PDF预览功能,uniapp微信小程序预览PDF,uniapp开发微信小程序在线预览pdf等文件,uniApp微信小程序实现PDF在线预览,Uniapp app在线预览pdf文件流,微信小程序实现pdf预览(苹果安卓兼容),uniapp-微信小程序 实现pdf外链在线预览,uniapp小程序如何做在线预览pdf功能,uniapp小程序端 实现pdf文件预览,微信小程序(uniapp)PDF预览完整实现方案示例demo源码,uni-app预览PDF,小程序pdf预览插件插件,Uniapp微信

✅ 精选推荐文章 4703

设计模式-桥接模式(Bridge)

桥接模式,也被称为柄体(Handle and Body)模式或接口(Interface)模式,是一种桥接模式,也被称为柄体(Handle and Body)模式或接口(Interface)模式,是一种结构型设计模式。它的主要目的是将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种分离可以通过组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。举个例子,假设有一个几何形状Shape类,从它能扩展出两个子类:圆形Circle和方形Square。

miaoyl的博客 1万+

从0到1用OpenClaw打造酒店收益管理系统:数据整合→AI策略迭代全链路落地实战

本文基于三亚某连锁海景酒店真实项目落地经验编写,系统上线3个月,酒店平均入住率从62%提升至80%,RevPAR(平均可售房收入)提升26%,淡季空置率降低46%,完全覆盖中小酒店全场景收益管理需求。本文配套OpenClaw全量Skill代码、工作流配置文件,可直接复用落地。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 491

设计模式学习4-Bridge模式

Bridge模式(桥接模式): 定义:将抽象与其实现解耦,使它们都可以独立地变化。(注:这里的实现指抽象类及其派生类用来实现自己的对象) 实现:将实现封装在一个抽象类中。在要实现的抽象的基类中包含一个实现的句柄。 结构图: 其中Abstraction为要实现的对象接口,Implementor为具体的实现类接口。Abstraction的派生类使用Implementor的派生类,却无需知...

weixin_30412167的博客 80

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java中画矩形的函数_阅读以下函数说明和Java代码,

阅读以下函数说明和Java代码,[说明]现要编写一个画矩形的程序,目前有两个画图程序:DP1和DP2,DP1用函数draw_a_line(x1,y1,x2,y2)画一条直线,DP2则用drawline(x1,x2,y1,y2)画一条直线。当实例化矩形时,确定使用DPI还是DP2。为了适应变化,包括“不同类型的形状”和“不同类型的画图程序”,将抽象部分与实现部分分离,使它们可以独立地变化。这里,“抽...

weixin_42543309的博客 384

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Unity学习笔记:设计模式-BRIDGE(桥接)

关键词:连接两端的变化 两个父类的派生类存在组合关系 排列组合的情况,其中一个父类调用另一个父类的方法 让子类继承,用以形成连接。 意图: 将抽象部分(主体的成员)与它的实现部分分离,使它们都可以独立地变化。 适用性: • 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。 例如这种情况可能是因为, 在程序运行时刻实现部分应可以被选择或者切换。 • 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时 B r i d g e模式使你可以对不同的抽象接口和实现部分进行组合,并分别对

自闭的饭盒 895

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Bridge设计模式

Bridge设计模式:分离抽象和具体,然后抽象部分可以按照自己的继承树来发展;同样具体部分也可以按照自己的继承树来发展;最后用聚合方式(桥)连接抽象和具体。

AlbenXie的博客 190

设计模式之bridge模式(1)

《Design Patterns Explained》对Bridge模式的特征: 意图:将一组实现与另一组使用他们的对象分离 问题:一个抽象类 的派生类 必须使用多个实现 ,但出现类数量增长   1.未使用Bridge实例: java 代码 abstract   class  Shape{         public   void  draw

jiqikewang的专栏 403

java设计模式---桥接模式

《设计模式》一书对Bridge是这样描述的:将抽象与其实现解耦,使它们都可以独立地变化。大致意思是说:将一组实现与另一组使用他们的对象分离。这里的实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类)。下面是《Design Patterns Explained》书中的例子。其结构图如下:  下面是它的实现:abstract class Shape{

张勤一 1086

设计模式(五)【Bridge模式】

Bridge模式 《设计模式》对Bridge模式的意图叙述为:将抽象与实现解耦,使它们都可以独立地变化。(一开始没太懂抽象为啥能和实现分离,后来读完才知道,这里的指A抽象与B实现解耦,而不是指同一个对象) 这里的实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类)。 示例研究 1、示例初始描述 编写一个程序,使用两种绘图程序之一绘制矩形(使用两个对点的坐标定...

xiaowei_innocence的博客 249

桥接模式

将抽象部分与它的实现部分分离,使他们可以独立地变化。别名为:Handle/Body。 Bridge模式是构造型的设计模式之一。Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。 结构如下图所示:

keep_moving_cqu的专栏 979

设计模式学习笔记-Bridge模式

《Design Patterns Explained》对Bridge模式的特征: 意图:将一组实现与另一组使用他们的对象分离 问题:一个抽象类 的派生类 必须使用多个实现 ,但出现类数量增长   1.未使用Bridge实例: java 代码 abstract   class  Shape{         public   void  d...

永源blog 198

Java设计模式-----Bridge桥接模式

源自:http://www.blogjava.net/flustar/archive/2007/11/28/bridge.html Bridge桥接模式: 将抽象与其实现解耦,使它们都可以独立地变化。大致意思是说:将一组实现与另一组使用他们的对象分离。这里的实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类)。 例子: public abstract

1297

设计模式:Bridge

备注:包含两种示例,一种是类图直译场景以便理解类图,另一种是伪现实场景以便应用。 Bridge Pattern:桥接模式,【GOF95】将抽象化 (Abstraction)与实现化(Implementation)解耦,使得二者可以独立地变化。 将两个角色之间的继承关系改为聚合关系,即强关联改为弱关联。因此,桥梁模式中的所谓解耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继...

luckljtchinaren的专栏 327

Bridge Strategy 和State的区别

Bridge Strategy 和State的区别 首先需要申明的是本文不是介绍Bridge Strategy 和State模式,而是讨论它们的区别,所以需要你对它们先有所了解。 Bridge模式用一句话来说就是将抽象和实现分离。这句话如何理解,在《Design Pattern Explained》一书中做了很详细的解释。说实话,我现在已经记不清它是怎么说的了。 吕震宇对此...

weixin_30284355的博客 133

(7)设计模式:bridge

设计模式:bridge 如果在子类的扩展中有2个维度,想解耦合,则用桥接。 package com.bjsxt.dp.bridge; public class Boy { private String name; public String getName() { return name; } public void setName(String name) {

牧海归来 528
上一篇: [DP]Adapter设计模式
下一篇: [DP]Composite设计模式
HeapStackk
博客等级 码龄12年 11粉丝 58原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值