封装相关知识
-
封装面向对象的三大特征:封装、继承、多态封装:将类的某些信息隐藏在类内部,不允许外部直接访问,而是通过该类提供的方法来实现对隐藏。封装的实现步骤:1、修改属性的可见性(private);2、创建getter/setter方法(用于属性的读写);3、在getter/setter方法中加入属性控制语句。//this关键字1、this关键字代表当前对象 this.属性 操作当前对象的属性;this.方法 操作当前对象的方法;2、封装对象的属性的时候,经常会用到this关键字public class Telphone{ private float screen; private float cpu; float mem; public void sendMessage(){ System.out.println("sendMessage") } public float getScreen(){ return screen; } public void setScreen(float screen){ th
-
什么是APP封装?APP封装如何实现?APP封装是形成APP的最省钱的一种方式。你只需要拥有一个网址就可以通过一些技术处理封装成一个跨iOS和Android的APP,这个过程往往只需要几分钟。在移动互联网时代,拥有一个移动端APP是必不可少的。那么APP是怎样封装的呢?APP封装实现封装APP大多指Web app封装,web app 是一种架构型APP开发方式,通过使用框架(HTML5 APP 框架开发模式)无论是iOS还是Android,都可以实现跨平台运行。通过这个框架,你可以把网址封装成APP,安装到手机设备上。网址简单说就是一个个网页(html5)组成的,封装成APP之后打开的的类似浏览器访问网页(html5)一样,因此网页(html5)访问手机硬件、手机权限等都会受到限制。Web app封装优点:1、可以直接封装成APP,成本低2、只要有网站(网址)就可以封装成APP,3、一次封装生成跨端APP4、代码维护方便,版本更新灵活,不受原生限制缺点:1、用户手机端体验感较差,长时间可能降低用户信任度2、原生功能使用受限,性能远不如原生由此引
-
项目中Axios二次封装1.为什么做封装? 方便代码整体调用、对请求做公共处理、个性化定制 2.别人已经封装了很多,为什么不直接修改使用? 封装思路不适合自身项目 封装后调用不方便 3.个人封装demo 代码结构【基于vue】 基本思路 将所有的请求接口地址按照文件分模块存储,比如 request/module/user 用户信息相关模块【服务】 2.封装方法、类。给所有请求绑定常用的请求方法,和对请求url上的路径参数做处理 generateServer.js import server from "../util/axiosConfig"; // 修改axios基本配置,
-
封装一个通用的PopupWindow上篇文章是关于建造者设计模式的,今天顺便封装一个通用的 PopupWindow 来实践一下, 同时也方便以后使用 PopupWindow,本文将从下面几个方面来介绍 PopupWindow 及其封装,具体如下: 概述 常用方法 基本使用 封装 PopupWindow 使用封装后的PopupWindow 显示效果 概述 PopupWindow 表示一个弹窗,类似于 AlertDialog,相较 AlertDialog 来说 PopupWindow 使用起来更灵活,可有任意指定要显示的位置,当然能够灵活的使用必然在某一层面有所牺牲,如 PopupWindow 相较 Al
封装相关课程
封装相关教程
- Java 封装 上一小节中,我们已经对类和对象有了一个基本的认识。不止于 Java,在各个面向对象语言的书籍资料中,都会提到面向对象的三大特征:封装、继承、多态。本小节我们就从封装开始,探讨面向对象的特征。本小节我们将学习什么是封装、为什么需要封装,最后也会以一个 NBA 球员类的案例来实现封装。
- 2. 为什么需要封装 封装具有以下优点:封装有利于提高类的内聚性,适当的封装可以让代码更容易理解与维护;良好的封装有利于降低代码的耦合度;一些关键属性只允许类内部可以访问和修改,增强类的安全性;隐藏实现细节,为调用方提供易于理解的接口;当需求发生变动时,我们只需要修改我们封装的代码,而不需要到处修改调用处的代码。
- 3.1 封装性 内部类的成员通过外部类才能访问,对成员信息有更好的隐藏,因此内部类实现了更好的封装。
- 4. axios 库封装 在真实的项目中会经常使用到 axios 这样的 ajax 请求的库,虽然可以直接使用,但是往往业务中会有很多接口请求的地方,而这么多的请求有些固定不变的,每个接口在请求时都需要,如:token,baseURL,timeout 等等,针对这样的场景,我们可以对 axios 库进行二次业务封装。对于接口不同的返回结果我们希望有一个全局的提示框,这里我们使用 element-ui 组件库搭配使用。封装后的代码如下:import axios from 'axios';import { baseURL } from '@/config'class Http { constructor(baseUrl) { this.baseURL = baseURL; this.timeout = 3000; } setInterceptor(instance) { instance.interceptors.request.use(config => { return config; }); instance.interceptors.response.use(res => { if (res.status == 200) { return Promise.resolve(res.data); } else { return Promise.reject(res); } }, err => { return Promise.reject(err); }); } mergeOptions(options) { return { baseURL: this.baseURL, timeout: this.timeout, ...options } } request(options) { const instance = axios.create(); const opts = this.mergeOptions(options); this.setInterceptor(instance); return instance(opts); } get(url, config = {}) { return this.request({ method: 'get', url: url, ...config }) } post(url, data) { return this.request({ method: 'post', url, data }) }}export default new Http;
- 3. 实现封装 在 Java 语言中,如何实现封装呢?需要 3 个步骤。修改属性的可见性为private;创建公开的 getter 和 setter 方法,分别用于属性的读写;在 getter 和 setter 方法中,对属性的合法性进行判断。我们来看一个 NBA 球员类NBAPlayer:class NBAPlayer { // 姓名 String name; // 年龄 int age;}在类内部(即类名后面{}之间的区域)定义了成员属性name和age,我们知道,在类外部调用处可以对其属性进行修改:NBAPlayer player = new NBAPlayer();player.age = -1;如下是实例代码:540运行结果:球员年龄为:-1我们通过对象名.属性名的方式对age赋值为 -1,显然,球员的年龄为-1是反常理的。下面我们对NBAPlayer类进行封装。我们可以使用私有化访问控制符修饰类内部的属性,让其只在类的内部可以访问:// 用private修饰成员属性,限定只能在当前类内部可以访问private String name;private int age;private关键字限定了其修饰的成员只能在类内部访问,这样之后就无法在类外部使用player.age =-1这样的赋值方式进行赋值了。创建公开的(public) getter 和 setter方法:// 通常以get+属性名的方式命名 getter,返回对应的私有属性public String getName() { return name;}// 通常以set+属性名的方式命名 setter,给对应属性进行赋值public void setName(String name) { this.name = name;}public int getAge() { return age;}public void setAge(int age) { this.age = age;}顾名思义,getter就是取属性值,setter就是给属性赋值,这样在类的外部就可以通过调用其方法对属性进行操作了。对属性进行逻辑判断,以age属性的setter方法为例:public void setAge(int age) { // 判断参数age的合法性 if(age < 0) { this.age = 0; } else { this.age = age; }}在setAge方法中,我们将参数age小于 0 的情况进行了处理,如果小于 0,直接将age赋值为0。除了给默认值的方式,我们也可以抛出异常,提示调用方传参不合法。在类外部对属性进行读写:NBAPlayer player = new NBAPlayer();// 对属性赋值:player.setName("詹姆斯");player.setAge(35);// 获取属性:System.out.println("姓名:" + player.getName());System.out.println("年龄:" + player.getAge());试想,如果在类外部,有很多地方都会操作属性值,当属性值读写逻辑发生改变时,我们只需修改类内部的逻辑。另外,对于有参构造方法中,对属性赋值时,直接调用其setter方法。无需再写重复的逻辑判断,提高代码复用性:public NBAPlayer(int age) { this.setAge(age);}如下是实现封装后完整实例代码:541运行结果:姓名:詹姆斯年龄:35-------------姓名:乔丹年龄:60
- 2. 为什么要封装独立 Handler? 即使我们把编码和解码封装成了方法,但是还是需要在 Handler 业务逻辑里面进行手工调用,虽然看似不怎么影响,但是业务 Handler 不够纯粹,应该让 Handler 只是专心的负责处理业务逻辑就好。实例:ch.pipeline().addLast(new MyEncoderHandler());//解码Handlerch.pipeline().addLast(new MyDecoderHandler());//编码Handlerch.pipeline().addLast(new MyBusiHandler());//业务Handlerpublic class MyBusiHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { //1.接受参数,可以直接强转 UserReq userReq=(UserReq)msg; //2.相应数据,直接写对象 UserRes res=new UserRes(); res.setCode(0); res.setMsg("接受成功"); ctx.writeAndFlush(res); }}通过以上的代码,我们把编码和解码封装成两个独立的 Handler,并且加入到 ChannelPipeline 里面进行管理。在我们的业务 Handler 里面就可以直接操作实体数据,无需手工转换成字节数组了。思考:那么如何进行封装 Handler 呢?
封装相关搜索
-
face
fade
fadein
fadeout
fadeto
fail
family
fastcgi
fastjson
fault
fclose
fdisk
feed
fetch
ff浏览器
fgets
fields
fieldset
fighting
figure