首页 文章 精选 留言 我的

精选列表

搜索[数据库设计],共10000篇文章
优秀的个人博客,低调大师

2-VVI-材料设计之CardView

零、前言 [1].CardView extends FrameLayout [2].一个带圆角和阴影的FrameLayout,FrameLayout怎么用,它就怎么用 [3].依赖implementation 'com.android.support:cardview-v7:26.1.0' CardView.gif 一、使用: 1.属性一览: app:cardBackgroundColor 背景颜色 app:cardCornerRadius 圆角大小 app:cardElevation z轴阴影高度 app:cardMaxElevation z轴最大高度值 app:contentPadding 内容与边距的间隔 app:contentPaddingLeft 内容与左边的间隔 app:contentPaddingTop 内容与顶部的间隔 app:contentPaddingRight 内容与右边的间隔 app:contentPaddingBottom 内容与底部的间隔 app:paddingStart 内容与边距的间隔起始 app:paddingEnd 内容与边距的间隔终止 app:cardUseCompatPadding 设置内边距,在API21及以上版本和之前的版本仍旧具有一样的计算方式 app:cardPreventConrerOverlap 在API20及以下版本中添加内边距,这个属性为了防止内容和边角的重叠 注意:CardView中使用android:background设置背景颜色无效。 2.可在style里抽一下常用的卡片样式: <!--cardView常用配置--> <style name="MyBaseCard" parent="@style/CardView.Light"> <item name="cardPreventCornerOverlap">false</item> <item name="cardUseCompatPadding">true</item> <item name="cardElevation">9dp</item> <item name="cardCornerRadius">6dp</item> <item name="android:foreground">?attr/selectableItemBackground</item> <item name="cardBackgroundColor">#A0BDF4</item> </style> 3.使用: <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.CardView android:id="@+id/id_cv" style="@style/MyBaseCard" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="15dp" android:layout_marginTop="8dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.441" app:layout_constraintStart_toStartOf="parent"> <LinearLayout android:layout_width="200dp" android:layout_height="230dp" android:orientation="vertical"> <ImageView android:layout_gravity="center" android:id="@+id/id_img" android:layout_width="wrap_content" android:layout_height="180dp" android:padding="5dp" android:src="@mipmap/c1"/> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:background="#E8E9EA" android:gravity="center" android:padding="8dp" android:text="红红战士" android:textColor="#FF0000"/> </LinearLayout> </android.support.v7.widget.CardView> </android.support.constraint.ConstraintLayout> 4.Activity: public class V02_CardActivity extends AppCompatActivity { @BindView(R.id.id_cv) CardView mIdCv; @BindView(R.id.id_img) ImageView mIdImg; int count = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a2_card); ButterKnife.bind(this); mIdCv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { runAnima(); } }); } private void runAnima() { mIdCv.animate().translationX(100 + count).setDuration(1000).start(); count += 10; } } 二、后记 1.阴影Padding CardView会自动添加一些额外的padding空间来绘制阴影部分, 这也导致了以V21为界的不同系统上CardView的尺寸大小不同 app:cardUseCompatPadding="true"适配 2.圆角覆盖:剪裁情况 app:cardPreventCornerOverlap="false"适配 3.点击涟漪 android:foreground="?android:attr/selectableItemBackground" 后记、 1.声明: [1]本文由张风捷特烈原创,转载请注明 [2]欢迎广大编程爱好者共同交流 [3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正 [4]你的喜欢与支持将是我最大的动力 2.连接传送门: 更多安卓技术欢迎访问:安卓技术栈 我的github地址:欢迎star 简书首发,腾讯云+社区同步更新张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com 3.联系我 QQ:1981462002 邮箱:1981462002@qq.com 微信:zdl1994328 4.欢迎关注我的微信公众号,最新精彩文章,及时送达: 公众号.jpg

优秀的个人博客,低调大师

JavaScript 设计模式之单例模式

1.单例模式 单例就是保证一个类只有一个实例,实现方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象。 单例模式的思路是:一个类能返回一个对象的引用(并且永远是同一个)和一个获得该实例的方法(静态方法,通常使用 getInstance 名称)。那么当我们调用这个方法时,如果类持有的引用不为空就返回该引用,否者就创建该类的实例,并且将实例引用赋值给该类保持的那个引用再返回。同时将该类的构造函数定义为私有方法,避免其他函数使用该构造函数来实例化对象,只通过该类的静态方法来得到该类的唯一实例 实现1: 最简单的对象字面量 var singleton = { attr : 1, method : function(){ return this.attr; } } var t1 = singleton ; var t2 = singleton ; 那么很显然的, t1 === t2 。 十分简单,并且非常使用,不足之处在于没有什么封装性,所有的属性方法都是暴露的。对于一些需要使用私有变量的情况就显得心有余而力不足了。当然在对于 this 的问题上也是有一定弊端的。 实现2:构造函数内部判断 function Construct(){ // 确保只有单例 if( Construct.unique !== undefined ){ return Construct.unique; } // 其他代码 this.name = "NYF"; this.age="24"; Construct.unique = this; } 那么也有的, t1 === t2 。 也是非常简单,无非就是提出一个属性来做判断,但是该方式也没有安全性,一旦我在外部修改了Construct的unique属性,那么单例模式也就被破坏了。 实现3 : 闭包方式 对于大着 灵活 牌子的JS来说,任何问题都能找到 n 种答案,只不过让我自己去掂量孰优孰劣而已,下面就简单的举几个使用闭包实现单例模式的方法,无非也就是将创建了的单例缓存而已。 var single = (function(){ var unique; function Construct(){ // ... 生成单例的构造函数的代码 } unique = new Constuct(); return unique; })(); 只要 每次讲 var t1 =single; vart2 = single;即可。 与对象字面量方式类似。不过相对而言更安全一点,当然也不是绝对安全。 如果希望会用调用 single() 方式来使用,那么也只需要将内部的 return 改为 return function(){ return unique; } 以上方式也可以使用 new 的方式来进行(形式主义的赶脚)。当然这边只是给了闭包的一种例子而已,也可以在 Construct 中判断单例是否存在 等等。 各种方式在各个不同情况做好选着即可。 总结 总的来说,单例模式相对而言是各大模式中较为简单的,但是单例模式也是较为常用并且很有用的模式。在JS中尤为突出(每个对象字面量都可以看做是一个单例么~)。 记住,是否严格的只需要一个实例对象的类(虽然JS没有类的概念),那么就要考虑使用单例模式。 使用数据缓存来存储该单例,用作判断单例是否已经生成,是单例模式主要的实现思路。 原文发布时间为:2018年01月31日原文作者:张泽立 本文来源:开源中国 如需转载请联系原作者

优秀的个人博客,低调大师

针对Student表的DAO设计实例

完整代码以及junit,mysql--connector包下载地址 :https://github.com/CasterWx/MyStudentDao 表信息: 代码: dao包----impl包----StudentDAOImpl.java 1 package dao.impl; 2 3 import dao.IStudentDAO; 4 import domain.Student; 5 6 import java.sql.*; 7 import java.util.ArrayList; 8 import java.util.List; 9 10 public class StudentDAOImpl implements IStudentDAO { 11 public static Connection connection = null ; 12 13 public void setConnection() { 14 try { 15 Class.forName("com.mysql.jdbc.Driver"); 16 System.out.println("连接成功"); 17 }catch (Exception e){ 18 System.out.println("连接失败"); 19 } 20 try{ 21 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/JavaJDBC","root","root"); 22 }catch (Exception e){ 23 } 24 } 25 26 public void shutdownConnection(){ 27 try { 28 if(connection!=null){ 29 connection.close(); 30 } 31 }catch (Exception e){ 32 } 33 } 34 @Override 35 public void save(Student student) { 36 setConnection(); 37 Statement statement = null ; 38 try { 39 statement = connection.createStatement(); 40 // sql语句:查询对应id 41 String sql = "INSERT INTO t_student(id,name,age) VALUES(" + student.getId()+",'"+student.getName()+"',"+student.getAge()+")"; 42 statement.executeUpdate(sql); 43 }catch (Exception e){ 44 }finally { 45 try{ 46 if (statement!=null){ 47 statement.close(); 48 } 49 }catch (Exception e){ 50 } 51 } 52 shutdownConnection(); 53 } 54 55 @Override 56 public void delete(Student student) { 57 Long id = student.getId() ; 58 delete(id); 59 } 60 61 @Override 62 public void delete(Long id) { 63 setConnection(); 64 Statement statement = null ; 65 try { 66 statement = connection.createStatement(); 67 // sql语句:查询对应id 68 String sql = "DELETE FROM t_student WHERE id="+id; 69 statement.executeUpdate(sql); 70 }catch (Exception e){ 71 }finally { 72 try{ 73 if (statement!=null){ 74 statement.close(); 75 } 76 }catch (Exception e){ 77 } 78 } 79 shutdownConnection(); 80 } 81 82 @Override 83 public void update(Long id, Student student) { 84 setConnection(); 85 Statement statement = null ; 86 try { 87 statement = connection.createStatement(); 88 // sql语句:查询对应id 89 String sql = "UPDATE t_student SET name='"+ student.getName() +"',age="+student.getAge() +" WHERE id="+id; 90 statement.executeUpdate(sql); 91 }catch (Exception e){ 92 }finally { 93 try{ 94 if (statement!=null){ 95 statement.close(); 96 } 97 }catch (Exception e){ 98 } 99 } 100 101 shutdownConnection(); 102 } 103 104 @Override 105 public void update(Student student) { 106 Long id = student.getId() ; 107 update(id,student); 108 } 109 110 @Override 111 public Student get(Long id) { 112 setConnection(); 113 Statement statement = null ; 114 ResultSet resultSet = null ; 115 Student student = null ; 116 try { 117 statement = connection.createStatement(); 118 // sql语句:查询对应id 119 String sql = "SELECT * FROM t_student where id="+id ; 120 resultSet = statement.executeQuery(sql); 121 if(resultSet.next()){ 122 student = new Student() ; 123 student.setId(resultSet.getLong("id")); 124 student.setName(resultSet.getString("name")); 125 student.setAge(resultSet.getLong("age")); 126 return student ; 127 } 128 }catch (Exception e){ 129 }finally { 130 try{ 131 if (statement!=null){ 132 statement.close(); 133 } 134 }catch (Exception e){ 135 }finally { 136 try{ 137 if(resultSet!=null){ 138 resultSet.close(); 139 } 140 }catch (Exception e){ 141 } 142 } 143 } 144 shutdownConnection(); 145 return null; 146 } 147 148 @Override 149 public ArrayList<Student> list() { 150 ArrayList<Student> list = new ArrayList<Student>() ; 151 setConnection(); 152 Statement statement = null ; 153 ResultSet resultSet = null ; 154 Student student = null ; 155 try { 156 statement = connection.createStatement(); 157 // sql语句:查询对应id 158 String sql = "SELECT * FROM t_student" ; 159 resultSet = statement.executeQuery(sql); 160 161 while(resultSet.next()){ 162 student = new Student() ; 163 student.setId(resultSet.getLong("id")); 164 student.setName(resultSet.getString("name")); 165 student.setAge(resultSet.getLong("age")); 166 list.add(student) ; 167 } 168 return list ; 169 }catch (Exception e){ 170 }finally { 171 try{ 172 if (statement!=null){ 173 statement.close(); 174 } 175 }catch (Exception e){ 176 }finally { 177 try{ 178 if(resultSet!=null){ 179 resultSet.close(); 180 } 181 }catch (Exception e){ 182 } 183 } 184 } 185 shutdownConnection(); 186 return list; 187 } 188 189 } dao包----IStudentDAO接口 1 package dao; 2 3 import domain.Student; 4 5 import java.util.ArrayList; 6 import java.util.List; 7 8 /** 9 * Student对象的CRUD操作 10 * */ 11 public interface IStudentDAO { 12 // ----------------------------------增-------------------------------------------- 13 14 /** 15 * 保存学生对象 16 * @param student 17 * */ 18 void save(Student student); 19 20 // ----------------------------------删-------------------------------------------- 21 22 /** 23 * 根据删除指定学生 24 * @param student 学生对象 25 * */ 26 27 void delete(Student student) ; 28 /** 29 * 根据主键删除指定学生 30 * @param id 学生对象主键 31 * */ 32 void delete(Long id) ; 33 34 // ----------------------------------改-------------------------------------------- 35 /** 36 * 更新指定学生信息 37 * @param id 学生对象主键 38 * @param student 学生对象 39 * */ 40 void update(Long id,Student student) ; 41 /** 42 * 根据主键删除指定学生 43 * @param student 学生对象 44 * */ 45 void update(Student student); 46 47 // ----------------------------------查-------------------------------------------- 48 49 /** 50 * 查询指定id的学生对象 51 * @param id 学生对象主键 52 * @return Student if id存在,返回Student对象,否则返回null 53 */ 54 Student get(Long id) ; 55 /** 56 * 查询所有学生对象 57 * @return 所有学生对象 58 * */ 59 ArrayList<Student> list() ; 60 } domain包-----Student.java 1 package domain; 2 3 public class Student { 4 private long id ; 5 private String name ; 6 private long age ; 7 public void getString(){ 8 System.out.println("Student(id="+id+",name="+name+",age="+age+")"); 9 } 10 public void setId(long id){ 11 this.id = id ; 12 } 13 public void setName(String name){ 14 this.name = name ; 15 } 16 public void setAge(long age){ 17 this.age = age ; 18 } 19 20 public long getId() { 21 return id; 22 } 23 24 public long getAge() { 25 return age; 26 } 27 28 public String getName() { 29 return name; 30 } 31 } test包----StudentDAOTest 1 package test; 2 3 import dao.IStudentDAO; 4 import dao.impl.StudentDAOImpl; 5 import domain.Student; 6 import org.junit.Test; 7 8 import java.util.ArrayList; 9 import java.util.List; 10 11 public class StudentDAOTest { 12 IStudentDAO iStudentDAO = new StudentDAOImpl(); 13 @Test 14 public void testSave() { 15 Student student = new Student() ; 16 student.setId(164L); 17 student.setName("Wber"); 18 student.setAge(100L); 19 iStudentDAO.save(student); 20 } 21 @Test 22 public void testDelete() { 23 iStudentDAO.delete(161L); 24 } 25 @Test 26 public void testUpdate() { 27 Student student = new Student() ; 28 student.setId(161L); 29 student.setName("wa"); 30 student.setAge(15L); 31 iStudentDAO.update(161L,student); 32 } 33 @Test 34 public void testGet() { 35 iStudentDAO.get(162L).getString(); 36 } 37 @Test 38 public void testList() { 39 ArrayList<Student> list = iStudentDAO.list() ; 40 for(int i=0;i<list.size();i++){ 41 list.get(i).getString(); 42 } 43 } 44 }

优秀的个人博客,低调大师

《.Ne框架程序设计》随记(3)

以往,每个应用程序进程都有自己的虚拟地址空间,通过地址空间的隔离来保证一个进程不会干扰另一个进程的运行。但通过验证托管代码,可以确保不会访问不该访问的内存,因此可以一个单独的虚拟地址空间内运行多个托管应用程序。由于太多的进程会占用过多的系统资源,损伤系统性能,并限制系统可用的资源。因此在一个进程中运行多个托管应用程序可以减少进程的数量,提高系统性能,降低资源需求,而同时应用程序仍然可以保持良好的健壮性。 CLR中,一个托管应用程序叫一个应用程序域(AppDomain)。默认地,一个托管exe仅仅执行在它自己拥有的地址空间中(这个地址空间只含有一个应用程序域),但CLR 的宿主进程(如IIS服务器等)可以决定在一个操作系统进程中运行多个应用程序域。 .net framework提供了一组丰富的类库(FCL),其中含有几千个类型的定义。CLR 和FCL使开发者可以创建以下应用程序:(1)XML Web服务;(2)Web窗体;(3)windows窗体;(4)控制台应用程序;(5)windows服务:windows服务控制管理器(SCM)控制的服务程序;(6)组件库; CLR支持三种互操作: (1) 托管代码调用DLL中的非托管函数。托管代码可以使用一种叫P/Invoke(就是平台调用)的机制来调用DLL中的函数。实际上,许多FCL中定义的类型内部都调用了从Kernel32.dll,User32.dll等DLL中导出的函数。例如,C#程序可以调用从Kernel32.dll中导出的CreateSemaphore函数。 (2) 托管代码使用现存的COM组件(非托管组件作为COM服务器)。利用现有的COM组件的类型库,我们可以创建出描述它们的托管程序集,托管代码可以象访问其他托管代码一样访问这些托管程序集中的类型。有时候没有类型库,我们可以在代码中创建自己的类型,CLR可以用这些类型进行正确的互操作,例如,可以在C# 应用程序中使用DirectX COM 组件。 (3) 非托管代码使用托管类型(托管类型作为COM服务器)。许多现存的非托管代码都需要提供COM组件才能正常运行。而用托管代码来实现这些组件更容易,因为这样可以避免处理引用计数和COM接口。例如,可以用C#来创建ActiveX控件或者shell扩展程序。 #include <stdio.h> #include <mscorlib.dll> using namespace System; void main() { printf("Hello,"); Console::WriteLine("World!"); } 在安装新的应用程序时却损坏了现有的应用程序,这叫“Dll hell”.现在大多数应用程序的安装都会影响系统的各个部分。例如,会复制许多文件到许多目录中,更新注册表设置,安装快捷键到桌面,开始菜单和快速启动中。这就是备份应用程序比较困难,因为必须复制所有的文件和相关的注册表内容,而要将应用程序移植到另外一抬机器也很困难,必须 重新安装。最后,卸载应用程序也很麻烦。.net framework使组件不再需要象COM那样在注册表中进行注册。它还包含了一个叫代码访问安全的安全模型,这是基于程序集的标识来控制的。 一个托管PE文件包含4部分:PE表头,CLR表头,元数据和IL代码。PE表头是系统要求的标准信息。CLR表头专用于那些需要CLR 才能运行的模块(托管模块)。CLR表头中包含和模块一起创建的元数据的主版本号和次版本号,一些标记,若模块是CUI或GUI,可执行文件还有一个标识入口点方法的MethodDef标记,以及一个可选的强命名数字签名。该表头还包括模块内某些元数据表的大小和偏移量。 元数据实际是一块二进制数据,其中包含一些表,可以分为3类:定义表,引用表,清单表。程序集中包含了一个文件用于保存清单(manifest).清单是另外一组元数据的集合,其中主要包含了程序集中一部分文件的名称,还描述了程序集的版本,语言文化,发布者,公有导出类型,以及组成程序集的所有文件。CLR总是先加载包含清单元数据的文件,然后利用该清单来获取程序集中的其他文件。程序集的特性:1)定义了可重用的类型。2)程序集标识有一个版本号。3)可以包含与之相关的安全信息。 可以在应用程序的配置文件中指定一个codeBase元素来配置程序需要下载的程序集文件。codeBase元素标识了一个可以找到程序集所有文件的URL地址。当尝试加载一个程序集的文件时,CLR首先获取codeBase元素的URL地址,然后检查本地机器的下载缓存看是否已经存在该文件,若存在,该文件就被加载,否则,CLR将codeBase元素的URL地址中将该文件下载到缓存,若找不到该文件,CLR将在运行时抛出FileNoFoundException异常。 程序集是一个可重用,可实施版本策略和安全策略的单元,它允许我们将类型和资源划分到不同的文件中,这样程序集的使用者就可以决定将哪些文件打包在一起部署,一旦CLR加载了程序集中包含清单的那个文件,就可以确定程序集的其他文件中包含了程序正在引用的类型和资源,任何程序集的使用者只需要知道包含清单的文件名称,文件的划分对使用者是透明的,并且可以在将来改变,同时又不会破坏现有应用程序的行为。 对于可执行应用程序(exe),配置文件必须位于应用程序的基目录中,并且它的名字必须是exe文件名再加.config扩展名。对于asp.net web窗体和xml web服务应用程序,配置文件必须位于 web应用程序的虚拟根目录下,并且名称总是web.config.另外,子目录也可以包含它们自己的web.config文件,并继承上一目录的配置设置。配置设置可以用于特定的应用程序,也可以用于整个机器。 强命名程序集有一个发布者的公钥/私钥对签名,其中公钥/私钥对唯一地标识了程序集的发布者,利用公钥/私钥对,我们可以对程序集进行唯一的标识,实施安全策略和版本策略。一个程序集有两种部署方式:私有方式和全局方式。私有方式将程序集部署在应用程序的基目录及其子目录下。弱命名程序集只能够进行私有部署。全局方式将程序集部署在一些CLR确知的地方,当CLR搜索程序集时,它就到这些地方去找。强命名程序集即可以进行私有部署,也可以进行全局部署。一个强命名程序集包含四个唯一标识程序集的特性:文件名(没有扩展名),版本号,语言文化标识,和一个公有密钥标记(由公有密钥产生的一个值)。若想唯一标识一个程序集,就必须首先获取一个公钥/私钥对,再将公钥/私钥对与程序集相关联。 CLR能够将名称相同但路径不同的多个文件加载到同一个地址空间,这叫“并存执行”,这是解决”Dell hell”的一个关键技术。在解析一个被引用的类型时,CLR可以在下面三个地方之一找到该类型:(1)同一个文件。对同一个文件中类型的访问在编译时就确定了。CLR直接从该文件中加载被引用的类型。(2)不同的文件,相同的程序集。(3)不同的文件,不同的程序集。当被引用的类型在一个不同的程序集文件中时,CLR会首先加载包含被引用程序集的清单所在的文件。若该文件没有包含需要的类型,CLR则会根据此清单文件加载适当的文件. 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/09/01/491831.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册