android框架之基础 原型设计模式

06-原型设计(墨刀):初识墨刀、原型设计、交互效果、项目演示 1、了解了墨刀的项目创建方式及菜单和功能;2、掌握的低保真原型设计的方法;3、掌握了页面和组件交互的实现效果;4、能够完成项目的发布及演示 阅读详情
原型设计模式也是创建型几个模式之一,提到创建型模式工厂模式,都以为是new一个对象出来,但是原型设计模式,并不通过new创建对象
定义:
原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例
用途:
原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据
原型模式就是把一个对象中的属性的值赋值给另外一个对象属性的值

使用复制也就是克隆必须要实现Cloneable接口,

public interface Cloneable {}发现这又是一个标记接口,还有就是要重写Object类中的clone()方法
package com.prototype;
public class Student implements Cloneable {
	private String name;
	private int age;
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {
		Object obj = super.clone();
		return obj;
	}
}
测试:
package com.prototype;
public class Test {
	public static void main(String[] args) throws CloneNotSupportedException {
		Student stu = new Student("zhouguizhi", 18);
		System.out.println("stu="+stu);
		Student cloneStu = (Student) stu.clone();
		System.out.println("cloneStu="+cloneStu);
		System.out.println("name="+cloneStu.getName()+"--"+"age="+cloneStu.getAge());
	}
}
运行结果:
stu=com.prototype.Student@2a139a55
cloneStu=com.prototype.Student@15db9742
name=zhouguizhi--age=18
你会发现克隆出来的对象内存地址值和原来的对象是不同的,所以这二个不是同一个对象,但是值是相同的,创建对象时属性的值都是默认值,而克隆出来的对象中的值是原始对象的属性值,


其实克隆就是类似这种把一个对象中的值赋值给另外一个对象,比如这样子:

Student stu = new Student("zhouguizhi", 18);
		System.out.println("stu="+stu);
		Student cloneStu = new Student();
		cloneStu.setName(stu.getName());
		cloneStu.setAge(stu.getAge());
这是这种效率比较低而已,所以java会把克隆也就是clone()方法放在native层,用c处理起来效率更高.

现在Student类上添加一个朋友的属性对象

package com.prototype;
public class Student implements Cloneable {
	private String name;
	private int age;
	private Friend friend;
	
	public Student(String name, int age, Friend friend) {
		super();
		this.name = name;
		this.age = age;
		this.friend = friend;
	}
	public Student() {
		super();
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {
		Object obj = super.clone();
		return obj;
	}
	public Friend getFriend() {
		return friend;
	}
	public void setFriend(Friend friend) {
		this.friend = friend;
	}
	class Friend{
		private int age;
		private String name;
		public Friend(int age, String name) {
			this.age = age;
			this.name = name;
		}
		public int getAge() {
			return age;
		}
		public void setAge(int age) {
			this.age = age;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
	}
}
Test.java
package com.prototype;
import com.prototype.Student.Friend;
public class Test {
	public static void main(String[] args) throws CloneNotSupportedException {
		Friend friend  =new Student().new Friend(20,"xiaofang");
		System.out.println("friend="+friend);
		Student stu = new Student("zhouguizhi", 18,friend);
		Student cloneStu = (Student) stu.clone();
		Friend cloneFriend  = cloneStu.getFriend();
		System.out.println("克隆后的friend="+friend);
		cloneFriend.setAge(99);//改变Friend对象中的值
		//获取原数据fried对象中的age值
		System.out.println("age="+friend.getAge());
	}
}
运行结果:

friend=com.prototype.Student$Friend@2a139a55克隆后的friend=com.prototype.Student$Friend@2a139a55age=99

从打印的结果看,明明是在克隆后的Student对象上获取到Friend对象后改变了age的值,但是原来的值也跟着改变了,说明了这个Friend对象在内存中是共享同一个对象才会造成这样结果
浅克隆:对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象
从上面的问题就引出了深克隆的问题
深克隆:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制(会创建对象在内存中分配就不一样)

对于上面的问题用深克隆可以解决

再次看下Student类的代码:

package com.prototype;
public class Student implements Cloneable {
	private String name;
	private int age;
	private Friend friend;
	
	public Student(String name, int age, Friend friend) {
		super();
		this.name = name;
		this.age = age;
		this.friend = friend;
	}
	public Student() {
		super();
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {
		Object obj = super.clone();
		Student student = (Student) obj;
		student.friend = (Friend) this.friend.clone();//把属性也进行克隆
		return obj;
	}
	public Friend getFriend() {
		return friend;
	}
	public void setFriend(Friend friend) {
		this.friend = friend;
	}
	class Friend implements Cloneable {
		private int age;
		private String name;
		public Friend(int age, String name) {
			this.age = age;
			this.name = name;
		}
		public int getAge() {
			return age;
		}
		public void setAge(int age) {
			this.age = age;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		@Override
		protected Object clone() throws CloneNotSupportedException {
			Object obj = super.clone();
			return obj;
		}
	}
}
Test.java
package com.prototype;
public class Test {
	public static void main(String[] args) throws CloneNotSupportedException {
		Friend friend  =new Friend(20,"xiaofang");
		System.out.println("friend="+friend);
		Student stu = new Student("zhouguizhi", 18,friend);
		Student cloneStu = (Student) stu.clone();
		Friend cloneFriend  = cloneStu.getFriend();
		System.out.println("克隆后的friend="+cloneFriend);
		cloneFriend.setAge(99);//改变Friend对象中的值
		//获取原数据fried对象中的age值
		System.out.println(friend==cloneFriend);
		System.out.println("age="+friend.getAge());
	}
}
运行结果:

friend=com.prototype.Friend@2a139a55
克隆后的friend=com.prototype.Friend@15db9742falseage=20

从结果上看发现friend和克隆出来的cloneFriend对象不是同一个对象了,而且改变克隆后的值也不会影响之前的值了.
从深克隆中发现也用到了浅克隆,上面的Friend对象重写了clone()方法就是浅克隆了,说明克隆可以多层嵌套.
其实使用序列化和反序列化也可以实现深克隆

package com.prototype;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Student implements Cloneable,Serializable {
	private static final long serialVersionUID = 1L;
	private String name;
	private int age;
	private Friend friend;
	public Student(String name, int age, Friend friend) {
		super();
		this.name = name;
		this.age = age;
		this.friend = friend;
	}
	public Student() {
		super();
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Friend getFriend() {
		return friend;
	}
	public void setFriend(Friend friend) {
		this.friend = friend;
	}
	/**
	 * 序列化和反序列化实现深克隆
	 */
	public Object deepClone() throws Exception {
         //将对象写到流里
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutputStream oos = new ObjectOutputStream(bos);
         oos.writeObject(this);
         //从流里读回来
         ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
         ObjectInputStream ois = new ObjectInputStream(bis);
         return ois.readObject();
	}
}
Test.java
package com.prototype;
public class Test {
	public static void main(String[] args) throws Exception {
		Friend friend  =new Friend(20,"xiaofang");
		System.out.println("friend="+friend);
		Student stu = new Student("zhouguizhi", 18,friend);
		Student student = (Student)stu.deepClone();
		Friend cloneFriend  = student.getFriend();
		System.out.println("克隆后的cloneFriend="+cloneFriend);
		cloneFriend.setAge(18);//原来是20 改为18
		System.out.println("原friend中的age值="+friend.getAge());
	}
}
运行结果:

friend=com.prototype.Friend@2a139a55
克隆后的cloneFriend=com.prototype.Friend@4554617c
原friend中的age值=20

Axure Android原型设计高级控件资源包 本文还有配套的精品资源,点击获取 简介:本资源包含两个适用于Axure的Android原型控件库,旨在辅助设计师高效创建贴近实际操作的Android应用原型。第一个库由YEFAN创建,提供了包括按钮、输入框、开关等在内的Android小部件。第二个库提供了Android桌面快捷方式、小部件、主屏幕效果等原型元素。通过这些控件,设计师能够快速搭建出具有高视觉真实感的交互原型,... 阅读详情

相关推荐

AxureAndroid安卓素材包:移动应用原型设计加速器

Axure RP是一个专业的快速原型设计工具,广泛应用于IT行业,特别在产品设计和用户体验领域占有重要地位。它支持多种平台,包括Web应用、移动应用、桌面应用和企业级应用。使用Axure RP,设计师可以快速地创建线框图、流程图、原型,并进行交互设计和高保真模拟。此工具不仅具有丰富的预设模板,还可以通过部件库来增强设计的可重用性和效率。部件库是Axure中用于存储和管理各种设计元素的集合。在原型设计过程中,部件库的作用相当于一个资源库,为设计师提供丰富的预制组件,以加速设计和原型构建过程。

weixin_42356162的博客 942

原型图

android:id="@+id/roundimage"         android:layout_width="400dp"         android:layout_height="400dp"         /> /////////////////////////////////////////////////////////////////////// View v =

wu3741481的博客 562

android设计axure精美图标 android原型设计必备

产品经理必备,设计出来的界面效果非常漂亮!!

Android --- 自定义ImageView 实现圆形图片

自定义ImageView实现圆形图片,主要是在onDraw()方法中实现绘制圆形图片,在onMeasure()中测量圆形的半径并设置View的宽高。效果如下图代码如下public class CircleImageView extends ImageView { <span style="color:r...

梁同学与Android 3164

android原型设计工具

android原型设计工具,开发Android前前设计界面,这是一款很实用的原型设计工具

Axure原型设计元件库,基于Axure RP 10/9/8,支持 Android、Apple、Windows、微信,移动、桌面

这里提供微信和小程序、iOS、macOS、Android、Windows 等多平台的 Axure RP 元件库,你的原型任你自由飞跃。 对于元件库的设计,我参考官方的设计规范文档,尽可能不放过任何一个像素的偏差, 无论长度、宽度、转角、颜色。希望你采用了此高保真元件,可以更好地和开发、测试 等团队成员深入沟通。 如果你的团队有 UI 设计人员,只希望你出具低保真的原型时,请在 Axure RP 软件中, 打开菜单 “Project > Page Style Editor”,做以下调整: ⇨ Sketchiness 为 20 左右 ⇨ Color 为 Grayscale ⇨ Font 为 自己找个中文手写字体 请将下载的 Axure RP 元件库 .rplib 文件放到 Axure RP 元件库目录下,然后重新打开 Axure RP 9/8 软件,并在元件库列表中选择相应元件库即可使用。 元件库目录位置: Windows 系统:我的文档/Axure/Libraries macOS 系统:文稿/Axure/Libraries

安卓进阶系列-04自定义原型图片显示(CircleImageView)的使用

CircleImageView的使用 背景 在APP的使用过程,很多情况下默认的ImageView是不能满足需求的,由于图片大小、形状等等影响,圆形的图片显示未免有些过于难看,这种情况下圆形图片展示更为合适一些。 但是,自己去继承ImageView这个类去完善有些过于麻烦,不过,不用担心,已经有开源项目写好了并且封装了。 https://github.com/hdodenhof/Cir...

周先森爱吃素的博客 1213

KG²RAG框架:知识图谱增强大模型检索生成技术解析

知识图谱(Knowledge Graph)作为结构化知识表示的重要方式,与向量检索技术结合形成了新一代检索增强生成(RAG)框架。其核心原理是通过图神经网络编码器提取子图特征,并与文本向量空间对齐,实现结构化与非结构化知识的协同检索。这种技术显著提升了专业领域问答的事实准确性,在医疗诊断、金融分析等需要高可靠性响应的场景中具有重要价值。KG²RAG框架创新性地采用双通道处理架构,结合Neo4j等图数据库与Milvus向量数据库,通过动态检索调度器智能选择最优检索路径。实测表明该方案能降低40%以上的事实错误

weixin_29306875的博客 105

1.7 界面原型设计

本节引言: 引用锤子科技视觉设计总监——罗子雄在重庆TEDx活动上说的一小段话: 每当我们看到一些美妙的设计的时候,很多人心里面会有一种冲动,这种冲动会让你们想去创造一些 新的东西,创造一些美妙的事物。 我们常说用户体验用户体验,用户使用你的软件,第一个会接触的是什么?没错,图形化界面(GUI),简称UI,对于用户而言,最直观,给用户留下第一印像的是往往是程序的界面,而非功能!人,总...

weixin_33714884的博客 404

ISCC-Amy‘s Code CTF-Reverse

ISCC-Amy's Code CTF-Reverse

m0_72904009的博客 682

PDF.js实现分片加载问题

PDF.js实现分片加载问题。

qq_32822693的博客 4977

Android 界面原型设计分类

由此,一个产品的UI是非常重要的,而产品的界面原型设计一般是由公司的产品经理+美工来完成的,需求分析 ->界面原型设计 ->我们来写代码!没错,图形化界面(GUI),简称UI,对于用户而言,最直观,给用户留下第一印像的是往往是程序的界面,而非功能!其实Android也给我们提供了一个"老掉牙"的界面设计工具,跟上面这些高大上的界面原型工具相比,差几十条街,可以理解成一个分离的ADT,比ADT高级一点的功能就是自动生成代码...对于很少接触原型设计的朋友来说,花1,2分钟就可以掌握这个工具,还是比较值得!

leyang0910的博客 361

SAP LSMW保姆级操作文档

SAP LSMW(Legacy System Migration Workbench)是一个强大的工具,旨在简化旧系统数据向SAP系统的迁移过程。它允许用户通过多种方式导入数据,包括直接输入、批处理输入和BAPI。LSMW支持数据映射和转换,确保数据在迁移过程中保持一致性,减少手动输入的需求,从而提高效率,适用于新系统实施和数据更新项目。在日常运维过程中我们经常会遇到用户要求我们批量改一写数据,通常这些字段的信息有些SAP是提供程序可以批量进行更改的比如主数据的MM17、通用更改数据的MASS。

我小时候很黑的博客 4942

android开发所用知识大纲

整理一下自己学习andorid的知识体系,经常在网上看博客,逛论坛,觉得这个有用那个有用,这个想学那个想学,结果过一段时间都不记得了。 Android; 1.Github 2.Marterial design 3.动画 4.设计模式 5.数据存储 6.四大组件 7.网络编程 8.常用框架及第三方 9.资源文件

dingqianyi2007的博客 334

SpringBoot+Vue+kkFileView实现文档管理(文档上传、下载、在线预览)

上面在使用OpenOffice实现doc、excel、ppt等文档的管理和预览。除此之外可用kkFileView实现包括且更多文档的预览。

BADAO_LIUMANG_QIZHI的博客 1万+

LeRobot — 基于 PyTorch 的真实世界机器人学习框架(一)- 核心框架模块解析

LeRobot 是一个开源的机器人学习框架,由 Hugging Face 开发,旨在降低机器人学的准入门槛。该框架提供完整的机器学习流程支持,包括数据采集、训练、评估和部署。核心模块涵盖数据集标准化、策略算法、硬件抽象和强化学习组件,采用模块化设计实现灵活扩展。通过集成 Hugging Face Hub,用户可以轻松共享数据集和预训练模型。LeRobot 特别注重真实世界的机器人应用,支持多种前沿算法如模仿学习、视觉语言动作模型等,并提供统一的硬件接口和仿真环境适配。

熊猫小妖的AI世界 171

android设计模式—原型设计模式

Log.e(“huangxiaoguo”, "订单---- number " + companyOrder1.getOderNumber() + “名称-----------” + companyOrder1.getName());Log.e(“huangxiaoguo”, "订单---- number " + companyOrder1.getOderNumber() + “名称-----------” + companyOrder1.getName());

2501_90404749的博客 1635

13、超声断层乳腺图像融合算法:乳腺癌诊断新突破

本文介绍了一种新型超声断层乳腺图像融合算法,通过结合超声透射(UTTc、UTTα)和反射断层图像(URT),实现对乳腺组织的多参数自动可视化。该算法能有效区分良性与恶性肿瘤,具有高准确性、无辐射、低成本等优势,适用于大规模乳腺癌早期筛查。初步临床测试验证了其可行性,未来有望成为乳腺癌诊断的新标准。

9q8w7e6r5的博客 154

android word设计模式,设计模式-原型设计模式

原型设计模式什么是原型设计模式原型设计模式应用场景原型设计模式Demo原型设计模式在Android源码中的应用原型设计模式总结参考:Android源码设计模式解析与实战1.什么是原型设计模式原型模式是一个创建型模式。用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。原型模式多用于创建复杂的或者构造耗时的实例,因为在这种情况下,复制一个已经存在的实例会更高效。2.原型设计模式应用场景类初...

weixin_39573136的博客 155

构网型逆变器下垂控制与电流限幅策略研究:理论、仿真与代码实现

随着分布式发电和微电网技术的快速发展,构网型(Grid-Forming, GFM)逆变器因其能够自主建立电压和频率参考、支撑弱电网及孤岛运行而受到广泛关注。本文提出并实现了一种基于下垂控制的构网型逆变器控制策略,将逆变器等效为受控电压源,通过L型滤波器接入配电网。在公共耦合点(PCC)处实时测量三相电压和电流,计算有功和无功功率,进而采用P-w和Q-V下垂控制生成内部频率和电压幅值,合成三相参考电压。针对故障情况下过电流问题,设计了一种自适应电流限幅模块:当电流幅值超过设定上限时,动态降低电压参考系数k_s

huanghm88的专栏 155

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

安卓设计模式应用总结

####1.建造者模式建造者模式顾名思义,类似一个大楼都是按照一砖一瓦建造完成, 他通常结合链式调用一起使用该模式Android 比较热门的第三方框架均有使用举例:Rxjava, Retrofit, Okhttp, Geendao, 等等#####2.观察者模式观察者模式是一种行为模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

weixin_38504171的博客 1556

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

安卓系统框架服务器,安卓连接服务器框架

安卓连接服务器框架 内容精选换一换安卓模拟器(Android Virtual Device),简称AVD,可以模拟安卓设备并将其运行在服务器上。利用AVD,您可以对安卓应用进行原型设计、开发和测试,而无需使用真实的手机。AVD具备运行安卓应用、adb连接、上网、屏幕、GPS定位、电池、及VNC远程连接等基本功能。本文档针对CentOS 7.6系统,指导搭建基于Taisha安卓模拟器(Android...

weixin_39580124的博客 708

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

Android 原型设计模式

简介原型模式是一个创建型的模式.原型就是应该有一个样板实例,我们可以从这个样板对象中复制出一个内部属性一致的对象,其实就是一个”克隆”,被复制的实例就是我们所称”原型”,这个原型是可定制的.主要是原型模式多用于创建复杂的或者[构造耗时]的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更加高效.原型模式的定义用原型模式指定创建对象的种类,并通过拷贝这些原型创建新的对象.原型模式的使用场景 一

Tanck的专栏 3885
上一篇: java 序列化和反序列化
下一篇: android json解析框架 Model转json
zhoushenxian
博客等级 码龄12年 453粉丝 549原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值